【自学嵌入式:计算机组成原理】26. 补码的计算方法
26. 补码的计算方法
有符号数与无符号数
1. 核心区别:最高位的作用
计算机以二进制位存储整数,位数决定表示范围(如8位、16位)。区分“有符号数”与“无符号数”的关键是最高位是否为符号位:
-
无符号数:所有位均用于表示数值大小,无符号位。
- 以8位无符号数为例:范围是 \(0000\ 0000_2\) 到 \(1111\ 1111_2\)(即十进制 \(0\) 到 \(255\) ),共 \(2^8 = 256\) 个值。
-
有符号数:最高位为符号位(0表示正数,1表示负数),剩余位表示数值。计算机中,有符号数统一用补码存储(原因:简化加减法运算、避免正负0歧义)。
- 以8位有符号数为例:范围是 \(-128\) 到 \(127\)(补码规则决定,后续详解)。
2. 有符号数的补码规则
有符号数用补码存储,需掌握以下要点:
(1)正数的补码
正数的补码与原码(二进制本身)相同。
- 例如:十进制
+5(8位),原码与补码均为 \(0000\ 0101_2\)(最高位0表示正数,后7位表示数值)。
(2)负数的补码
负数的补码通过“原码(正数)按位取反 + 1”得到:
- 写出对应正数的二进制原码;
- 对所有位按位取反(0变1,1变0);
- 加1,结果即为负数的补码。
- 示例:求
-3的8位补码
① 正数+3的原码:\(0000\ 0011_2\)
② 按位取反:\(1111\ 1100_2\)
③ 加1:\(1111\ 1100_2 + 0000\ 0001_2 = 1111\ 1101_2\)
因此,-3的8位补码是 \(1111\ 1101_2\)。
(3)补码的优势:统一“0”的表示
无符号数或早期编码中,“0”可能有两种表示(如 +0 和 -0 ),导致歧义。补码通过规则让 +0 和 -0 统一:
+0的补码:\(0000\ 0000_2\)- 若按负数规则计算
-0:正数0取反为 \(1111\ 1111_2\),加1后溢出(\(1111\ 1111_2 + 1 = 1\ 0000\ 0000_2\)),截断8位后为 \(0000\ 0000_2\),与+0一致。
因此,补码下“0”仅有一种表示,简化了运算逻辑。
3. 表示范围对比(以8位为例)
| 类型 | 二进制范围 | 十进制范围 | 说明 |
|---|---|---|---|
| 无符号数 | \(0000\ 0000_2 \sim 1111\ 1111_2\) | \(0 \sim 255\) | 8位全表数值 |
| 有符号数 | \(0000\ 0000_2 \sim 0111\ 1111_2\)(正数) \(1000\ 0000_2 \sim 1111\ 1111_2\)(负数) |
\(-128 \sim 127\) | 最高位为符号位,补码规则扩展负数范围 |
4. 混合使用的风险
若程序中混合有符号数与无符号数运算,会因“符号位是否参与数值计算”产生错误。例如:
- 无符号数
255(\(1111\ 1111_2\))与有符号数-1(补码 \(1111\ 1111_2\))二进制相同,但数值逻辑不同。 - 运算时,计算机可能误将有符号数的符号位当作数值位(或反之),导致结果异常。
补码的运算应用:简化加减法
补码的核心价值是将减法转化为加法,统一计算机的运算逻辑(硬件只需实现加法器)。
示例:计算 5 - 3(等价于 5 + (-3) )
步骤1:将运算转化为“加法”
十进制:5 - 3 = 5 + (-3)
步骤2:写出对应数的8位补码
+5的补码:\(0000\ 0101_2\)(正数补码与原码一致)-3的补码:按“取反+1”规则,得到 \(1111\ 1101_2\)(前文已计算)
步骤3:补码相加
二进制加法:
0000 0101 (+5 的补码)
1111 1101 (-3 的补码)
= 1 0000 0010 (进位 1,共 9 位)
步骤4:截断位数(保留8位)
因是8位运算,舍弃最高位进位,结果为 \(0000\ 0010_2\),对应十进制 2(正确结果:5-3=2)。
原理:补码如何让减法变加法
补码的设计利用了模运算(如8位的模是 \(2^8 = 256\) )。对负数而言,补码等价于“模减去其绝对值”:
- 例如,
-3的补码 \(1111\ 1101_2\) 对应十进制253(\(2^8 - 3 = 253\) )。 - 因此,
5 + (-3)等价于5 + 253 = 258,对256取模(\(258 \mod 256 = 2\) ),结果与十进制减法一致。
总结
- 有符号数与无符号数:核心区别是最高位是否为符号位,无符号数全表数值,有符号数用补码存储(最高位为符号位)。
- 补码规则:正数补码与原码一致,负数补码为“原码(正数)取反+1”,可避免正负0歧义。
- 运算优势:补码将减法转化为加法,简化硬件设计,运算时需注意位数截断与符号位处理。
- 实践风险:混合有符号数与无符号数运算易引发逻辑错误,需严格区分类型。
掌握补码与有符号数的规则,是理解计算机数值存储、运算逻辑的基础,后续学习数据类型、溢出问题时需深度结合这些概念。
浙公网安备 33010602011771号