1- 以8位数据为例,无符号数编码的范围 0000 0000b-1111 1111b 0-255
255 = 2^8 -1
2- 有符号数编码
用8位数据的最高位表示符号位,0表示整, 1表示负
0000 0000 0
0000 0001 1
0000 0010 2
0111 1111 127
1000 0000 ?
1000 0001 -1
1000 0010 -2
1111 1111 -127
可见表示数的范围 -127 -- 127 1000 0000 ? 无法表示
考虑用反码
0000 0000 0 1111 1111 ?
0000 0001 1 1111 11110 -1
0000 0010 2 1111 11101 -2
0111 1111 127 1000 0000 -127
也出现重复的0
为了解决这种问题,采用一种称为补码的编码方法, 这种思想是: 先确定用 0000 0000b- 0111 1111b表示 0 -127 然后再用它们按位取反加1后的数据表示负数.
0000 0000:0 1111 1111b+1 = 0000 0000b:0
0000 0001:1 1111 1110b+1 = 1111 1111b:-1
0000 0010:2 1111 1101b+b = 1111 1110b:2
0111 1111:127 1000 0000b+1 = 1000 0001b:-127
发现,以上方案中:
(1) 最高位为1,表示负数
(2) 正数的补码取反+1 为其对应的负数的补码;负数的补码取反+1,为其绝对值.
1的补码为 0000 0001 取反 1111 1110 + 1 = 1111 1111b = -1
-1的补码为 1111 1111取反 0000 0000 + 1 = 0000 0001b = 1
3- 求-20的补码? 1110 1100b
正数 取反加1为 负数
负数 取反加1为 正数
20 = 0001 0100 取反 1110 1011 + 1 = 1110 1100b 可知 -20的补码为 1110 1100b
4- 1000 0000b表示什么呢? -128
高位为1 表示负数 取反 0111 1111b + 1 = 1000 0000b 表示正数的 2^8 = 128 所以 1000 0000b 表示 - 128
所以8位补码所表示的数的范围 -128 ~ 127
5- 补码为有符号数提供了方便,运算后的结果依然满足补码规则
10 0000 1010b
(+) -20 +1110 1100b
-10 1111 0110b