补码

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

原文地址:https://www.cnblogs.com/galoishelley/p/3574755.html