1. 无符号数、补码、反码、原码
对于向量x=[xw-1,xw-2,...,x0], 其中xi取0或1
无符号数:
原码:
最高位表示符号位,其余位表示值 。例如,[1111 1111, 0111 1111] = [-127,127]
反码:
正数的补码是其本身,而负数的补码是在原码的基础上,最高位不变,其他位取反。
补码:
正数的补码是其本身,而负数的补码是在原码的基础上,最高位不变,其他位取反,最后加1(即在反码的基础上加1)。
2. 区分补码、原码和反码的意义
使用原码时,人脑可以理解最高位代表正负号的含义,但是对于机器来说,在识别数字的同时还有区分出正负号,会对机器带来极大的负担。
于是使用补码和反码来帮助机器理解如何将符号位加入运算。
反码的出现时为了解决原码做减法的问题
例如计算:1-1 = 1+(-1)=[0000 0001]原+[1000 0001]原 = [0000 0001]反+[1111 1110]反 = [1111 1111]反 = [1000 0000]原 = -0
然而,在实际中并没有对-0和+0进行区分,因而引入了补码来解决0的符号问题
例如计算:1-1 = 1+(-1)=[0000 0001]原+[1000 0001]原 = [0000 0001]补+[1111 1111]补 = [0000 0000]补 = [0000 0000]原 = 0
除此之外:(-1)+(-127) = [1000 0001]原+[1111 1111]原 = [1111 1111]补+[1000 0001]补 = [1000 0000]补 = -128
从而使用补码,还能多表示一个最低数。因而,使用原码和反码表示的范围为[-127,127],而使用补码时范围为[-128,127]
3. 移位运算
对于左移操作(<<)而言。不管是有符号数还是无符号数,x<<k,都是对于x而言,丢弃最高K位,并在右边末端添上k个0。
而对于右移操作(>>)而言,则分为逻辑右移和算术右移。其中逻辑右移在左端补k个0,而算术右移则是在左端补上k个最高位。
操作 | 值 |
x | [1001 0101] |
x << 4 | [0101 0000] |
x >> 4(逻辑右移) | [0000 1001] |
x >> 4 (算术右移) | [1111 1001] |
(以下二进制均为补码表示,即移位是用补码进行的(这是因为计算机中用的是补码表示))
左移操作相当于乘以2的k次方;而右移操作相当于除以2的k次方 (均只适用于被舍弃的高位不含1的情况)