目录

原码、反码、补码

原码、反码、补码

原码、反码、补码

封面: https://www.mylittlewallpaper.com/c/vocaloid/download/5381c1271f52d0.23342334

计算机使用二进制表示数值,但是二进制没有正反,那么如何使用二进制表示正反呢?

原码、反码、补码就是解决这个问题的:

  • 原码(Sign-Magnitude)
  • 反码(Ones’ Complement)
  • 补码(Two’s Complement)← 现代计算机标准

原码(Sign-Magnitude)

表示方法:

  • 最高位表示符号:0为正,1为负
  • 其余位表示数值的绝对值

负数表示也就是:取出最左边的位(最高位)表示正反

示例(4位):

+5:0101
-5:1101

问题:

  • 有+0和-0两种零:00001000
  • 加减法电路复杂

反码(Ones’ Complement)

表示方法:

  • 正数:与原码相同
  • 负数:将对应正数的所有位取反(0变1,1变0)

负数表示也就是:符号位不变,其余取反

计算规则:

负数 = 按位取反(对应正数)

示例(4位):

+5:0101
-5:1010  (将0101的每一位取反)

验证:5 + (-5) = 0

  0101 (+5)
+ 1010 (-5)
-----------
  1111  (这是-0的反码表示)
  

特点:

  • 仍然有+0(0000)和-0(1111)的问题
  • 加减法比原码简单,但仍有循环进位问题

补码(Two’s Complement)← 现代标准

表示方法:

  • 正数:与原码相同
  • 负数:将对应正数的所有位取反后加1

负数表示也就是反码+1

计算规则:

负数 = 按位取反(对应正数) + 1

示例(4位):

+5:0101
-5:1011  (将0101取反得1010,再加1得1011)

验证:5 + (-5) = 0

  0101 (+5)    正数不需要改变
+ 1011 (-5)    负数使用补码
-----------
 10000  (4位系统中,最高位进位,被丢弃,只留4位)
  0000  = 0 ✓

三种编码对比(4位系统)

十进制原码反码补码
+7011101110111
+6011001100110
+5010101010101
+4010001000100
+3001100110011
+2001000100010
+1000100010001
+0000000000000
-010001111
-1100111101111
-2101011011110
-3101111001101
-4110010111100
-5110110101011
-6111010011010
-7111110001001
-81000

总结

特性原码反码补码
零的表示+0和-0+0和-0唯一0
加减法复杂较简单统一简单
硬件需求较少最少
现代使用基本不用很少用标准

补码是现代计算机表示有符号整数的标准,它解决了零的歧义问题,成为了最终的计算机负数计算的最终解决方案