Skip to content

定义Definition

定宽整数与二进制补码

Fixed-width integer representation · Two’s complement

区分位串、无符号值和补码值,逐位核对模加法、进位与有符号溢出的不同条件。

形式陈述 ​

位串不是带正负号的整数 ​

固定宽度 w≥1,把位串写成 bw−1⋯b0,每个 bi∈{0,1}。同一位串按不同权重解释为整数,无符号解释和二进制补码解释分别为

U(b)=∑i=0w−1bi2i,S(b)=U(b)−bw−12w.

于是 U 的范围是 [0,2w−1],S 的范围是 [−2w−1,2w−1−1]。所谓补码最高位是符号位,是说它在 S 中具有权重 −2w−1,不是把其他位当绝对值再加一个负号。

定义定宽加法为保留普通二进制和的低 w 位,即 U(r)=(U(a)+U(b))mod2w。无符号进位条件是 U(a)+U(b)≥2w;有符号溢出条件是整数和 S(a)+S(b) 不在 S 的可表示范围内。这两个判据回答不同问题。

直觉

位串相当于有限个格子的标签。无符号与补码是读标签的两把尺子;加法器可以用同一个低位结果,比较器却必须知道使用哪把尺子。八位 11111111 在两种解释下分别是 255 和 −1,并没有一个脱离解释规则的“真正数值”。

补码的便利来自 −x 与 2w−x 同余。因此在 w 位内对 x 逐位取反再加一,得到加法逆元。0 的逆元仍是 0;最小负数的取负则是一个重要边界。

例子与边界

进位不等于有符号溢出 ​

八位下,01111111 + 00000001 = 10000000。无符号计算是 127+1=128,没有第九位进位;有符号计算期望 128,却得到 −128,所以有符号溢出。反过来,11111111 + 00000001 的完整和为 1 00000000:无符号 255+1 产生进位,但补码 −1+1=0 没有溢出。

两个补码操作数同号、结果异号,恰是加法有符号溢出的判据。异号相加不会超出范围,因为结果位于两数之间。对同号输入,超出正端会跨到最高位为一的区间,超出负端则绕到最高位为零的区间;这也解释了判据,而非仅记忆一个位公式。

不能表示的相反数 ​

八位 10000000 表示 −128。取反加一仍得 10000000,因为 128 不在有符号八位范围内。模运算确实给出自己的加法逆元,但把它解释为普通整数上的取负便失败。饱和算术会改为夹到边界,异常算术会拒绝操作,都不是本页的模加法。

相同位串,不同排序 ​

比较 11111111 与 00000001:无符号关系是 255>1,补码关系是 −1<1。因此把 signed compare 换成 unsigned compare 会改变控制流。经验证的指令选择必须保留这个解释;只用小正数做测试无法检出错误。

推论与应用

Word-RAM可以选择模 2w 的字运算,本页提供其中数值解释的接口;它没有据此规定某条实际 CPU 指令的耗时。扩展与截断进一步处理宽度变化时哪些数值被保留。

机器级模运算也不自动决定源语言的溢出语义。要判断一段 C、Rust 或其他语言程序,仍须使用该语言和模式的规则,不能仅凭底层加法器会回绕就替源码作出结论。

参考资料
  • UC Berkeley CS61C,Integer Representations,课程笔记,访问于 2026-10-08;用于定宽表示与补码背景。
  • Randal E. Bryant and David R. O’Hallaron, Computer Systems: A Programmer’s Perspective, 3rd ed., 2016,§2.2–2.3。本文八位算例与判据推导独立列出,不绑定某种源语言行为。
关系图谱31 个相邻概念 · 1 类关系

拖动节点调整位置。

显示关系

显示:依赖

  1. 前置三跳
  2. 前置二跳
  3. 前置一跳
  4. 当前条目
  5. 后续一跳
  6. 后续二跳
  7. 后续三跳
文字版关系按与当前条目的最短距离分组