原码、反码、补码实战

计算机内部只能存储0和1,对于整数,需要一种方式来表示正数和负数。原码、反码、补码就是三种不同的编码方案。

现代计算机统一使用补码来存储有符号整数。原因:

  • 补码可以将减法转化为加法运算
  • 补码没有“正负0”的问题
  • 补码的符号位可以直接参与运算

原码

规则:最高位表示符号(0正1负),其余位表示数值的绝对值。

数值原码(8位)
+10000 0001
-11000 0001
+00000 0000
-01000 0000
+1270111 1111
-1271111 1111

范围:-127 ~ +127(8位),有正负零两个编码。

反码

规则

  • 正数的反码 = 原码
  • 负数的反码 = 符号位不变,数值位按位取反
数值原码反码
+10000 00010000 0001
-11000 00011111 1110
+00000 00000000 0000
-01000 00001111 1111
+1270111 11110111 1111
-1271111 11111000 0000

范围:-127 ~ +127,仍有正负零问题。

补码

规则

  • 正数的补码 = 原码
  • 负数的补码 = 反码 + 1
数值原码反码补码
+10000 00010000 00010000 0001
-11000 00011111 11101111 1111
+00000 00000000 00000000 0000
-01000 00001111 11110000 0000
+1270111 11110111 11110111 1111
-1271111 11111000 00001000 0001
-1281000 0000

范围:-128 ~ +127(8位),只有一个零的编码

注意:-128没有对应的原码和反码,但补码表示为1000 0000。

补码计算推导

减法可以转化为加法

公式:A – B = (A的补码) + (-B的补码)

示例:-5-3

-5的补码1111 1011
-3的补码1111 1101
加法1111 1011 + 1111 1101 = 1 1111 1000
取低8位1111 1000
转十进制补码1111 1000,减1得1111 0111,取反得1000 1000 = -8 ✅

示例:-128-1(溢出)

-128补码1000 0000
-1补码1111 1111
加法1000 0000 + 1111 1111 = 1 0111 1111
取低8位0111 1111 = 127

相关考点

概念辨析:

  • 正数、负数的原码、反码、补码之间的换算关系
  • 补码存在的原因

范围记忆:

  • 8位有符号整数的范围:-128~127
  • 8位原码/反码的范围:-127~127

计算题相关:

  • 已知原码求补码
  • 已知补码求真值
  • 补码加减法结果判断