以整数 5 为例,2进制 可得:
00000000 00000000 00000000 00000101 (原码)
将第 1 位来表示符号位,0代表正,1代表负。所以 -5 可用:
10000000 00000000 00000000 00000101 (原码)
反码
正数的反码和原码一样,负数的反码就是在原码的基础上符号位保持不变,其他位取反。还是以整数 5 为例,反码如下:
00000000 00000000 00000000 00000101 (反码)
再以整数 -5 为例,反码如下:
11111111 11111111 11111111 11111010 (反码)
补码
正数的补码和原码一样,负数的补码就是反码+1。还是以整数 5 为例,补码如下:
00000000 00000000 00000000 00000101 (补码)
再以整数 -5 为例,补码如下:
11111111 11111111 11111111 11111011 (补码)
<< (左移)
正负整数规则相同,向左被移出的位被丢弃,右侧用 0 补充。在使用补码作为机器数的机器中,以整数 5 << 2 为例:
00000000 00000000 00000000 00000101 (5 补码)
00000000 00000000 00000000 00010100 (5 << 2)
同样,以 -5 << 2 为例:
10000000 00000000 00000000 00000101 (-5 原码)
11111111 11111111 11111111 11111011 (-5 补码)
11111111 11111111 11111111 11101100 (-5 << 2 补码)
10000000 00000000 00000000 00010100 (-5 << 2 原码)
所以结果 5 << 2 = 20,-5 << 2 = -20 ,在数字没有溢出的前提下,在数字 x << y = x * 2y
>> (有符号右移)该操作符会将第一个操作数向右移动指定的位数。向右被移出的位被丢弃,拷贝最左侧的位以填充左侧。以整数 5 >> 2 为例:
00000000 00000000 00000000 00000101 (5 补码)
00000000 00000000 00000000 00000001 (5 >> 2 = 1)
以整数 -5 >> 2 为例:
11111111 11111111 11111111 11111011 (-5 补码)
11111111 11111111 11111111 11111110 (5 >> 2 补码)
10000000 00000000 00000000 00000010 (-2 原码)
>>> (无符号右移)
该操作符会将第一个操作数向右移动指定的位数。向右被移出的位被丢弃,左侧用0填充。因为符号位变成了 0,所以结果总是非负的。对于非负数,有符号右移和无符号右移相同。以整数 5 >>> 2 为例:
00000000 00000000 00000000 00000101 (5 补码)
00000000 00000000 00000000 00000001 (5 >>> 2 = 1)
而对于-5 >>> 2 来说:
11111111 11111111 11111111 11111011 (-5 补码)
00111111 11111111 11111111 11111110 (-5 >>> 2 补码)
00111111 11111111 11111111 11111110 (-5 >>> 2 原码)