为什么计算机使用补码存储整数:补码的本质
要理解“两个绝对值相同的有符号整数的和,舍弃进位的最高位后值为0”,需要结合 有符号整数的二进制表示(补码规则) 和 计算机的固定位数运算特性 来拆解,核心是“符号相反、绝对值相等”的两个数在二进制层面的抵消效应。
第一步:明确前提——“绝对值相同的有符号整数”的本质
有符号整数的绝对值相同,意味着它们是 一对“相反数”(符号相反,数值部分相同)。例如:
- 十进制:
+5
和-5
(绝对值都是5) - 十进制:
+127
和-127
(绝对值都是127)
在计算机中,有符号整数统一用 补码 存储(解决“正负0”和减法统一为加法的问题),补码的核心规则是:
- 正数的补码 = 原码(二进制数值部分直接表示,最高位为符号位:0=正,1=负);
- 负数的补码 = 其“绝对值的原码”按位取反 + 1(符号位为1)。
第二步:以具体例子看二进制运算过程
以 8位有符号整数 为例(计算机中整数运算有固定位数,如8/16/32位,超出位数的进位会被舍弃),用“+5”和“-5”演示:
1. 先写出两个数的补码
-
+5(正数):
符号位=0,数值部分=5的二进制(0000101
),所以8位补码为:0000 0101
。 -
-5(负数):
先取绝对值5的原码(0000 0101
)→ 按位取反(1111 1010
)→ 加1(1111 1011
),所以8位补码为:1111 1011
。
2. 计算两数的和(二进制加法)
二进制加法规则:0+0=0
,0+1=1
,1+1=10
(本位写0,向高位进1)。
将 +5
(0000 0101
)和 -5
(1111 1011
)相加:
0000 0101 (+5的补码)
+ 1111 1011 (-5的补码)
-----------
1 0000 0000 (结果:本位和为0000 0000,最高位产生进位1)
3. 关键:舍弃“进位的最高位”
8位整数的运算结果只能保留8位,超出的“最高位进位1”会被直接舍弃,最终结果为:0000 0000
(对应十进制的0)。
第三步:抽象本质——“相反补码”的加法抵消
为什么会出现这种结果?核心是 负数补码的设计恰好让“正数+负数(绝对值相等)”的二进制和为“全0+进位1”:
- 设正数的补码为
X
(符号位0,数值部分为a
),则其绝对值的原码就是a
; - 负数的补码为
~a + 1
(符号位1,数值部分是a
取反加1); - 两数相加:
X + (~a + 1) = (0 + a) + (~a + 1) = (a + ~a) + 1
。
而 a
是 n
位二进制数(n
为数值部分位数),a + ~a
的结果是 全1(例如 a=0000101
,~a=1111010
,和为 1111111
);
再加上1后,全1 + 1 = 1000...0
(n+1
位,本位全0,最高位进1)。
当计算机按固定位数(如8位)存储时,进位的1被舍弃,剩下的就是 全0,对应十进制的0。
第四步:扩展到任意位数(非8位)
无论整数是16位、32位还是64位,规律完全一致。例如32位有符号整数 +10
和 -10
:
+10
补码:00000000 00000000 00000000 00001010
-10
补码:11111111 11111111 11111111 11110110
- 相加结果:
1 00000000 00000000 00000000 00000000
- 舍弃进位后:
00000000 00000000 00000000 00000000
(即0)。
总结
“两个绝对值相同的有符号整数的和,舍弃进位最高位后为0”,本质是 计算机用补码表示负数时,相反数的二进制补码相加会产生“全0结果+进位1”,而固定位数运算会舍弃超出的进位,最终结果自然为0。这也是计算机中“减法转化为加法”(a - b = a + (-b)
)能正确运算的底层逻辑基础。