【自学嵌入式:计算机组成原理】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”得到:

  1. 写出对应正数的二进制原码;
  2. 对所有位按位取反(0变1,1变0);
  3. 加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. 有符号数与无符号数:核心区别是最高位是否为符号位,无符号数全表数值,有符号数用补码存储(最高位为符号位)。
  2. 补码规则:正数补码与原码一致,负数补码为“原码(正数)取反+1”,可避免正负0歧义。
  3. 运算优势:补码将减法转化为加法,简化硬件设计,运算时需注意位数截断与符号位处理。
  4. 实践风险:混合有符号数与无符号数运算易引发逻辑错误,需严格区分类型。

掌握补码与有符号数的规则,是理解计算机数值存储、运算逻辑的基础,后续学习数据类型、溢出问题时需深度结合这些概念。

posted @ 2025-07-15 13:14  秦瑞迁  阅读(494)  评论(0)    收藏  举报