1.13 绕不开的加法器

沿输入位、半加器、全加器、进位链和多位输出追踪整数加法,用布尔门、溢出和故障实验验证。

学习目标

  • 能用 XOR、AND、OR 解释半加器、全加器和逐位进位链的输入输出
  • 能区分每一位的和、生成进位、传入进位、多位结果和有符号溢出
  • 能在缺少进位、位宽边界和门逻辑错误场景中定位首个错误并重放真值轨迹

1.13 绕不开的加法器

本页依据刘欣《码农翻身》(2018 年第 1 版)及出版社公开书目信息,独立重构 1.13 绕不开的加法器。正文、代码、图示、实验和练习都是本课程重新设计的教学材料,不复制原书正文、插图、练习答案或代码。

整数加法不是一个不可拆的黑盒。半加器处理两个输入位,XOR 产生和、AND 产生进位;全加器再把低位传入进位合并,多个全加器串成多位加法器。每一位都要保存输入、和、生成进位、传入进位和传出进位,最终还要按位宽解释结果与溢出。

三个会让加法器模型失真的陷阱

加法器合同

不是把加法拟人化,而是要求每一位的布尔输入、输出和进位关系可计算、可观察、可复位。

全加器的关系可以写成:

sum=abcin,cout=ab+cin(ab)sum=a\oplus b\oplus c_{in},\quad c_{out}=ab+c_{in}(a\oplus b)

多位加法器从最低位到最高位传递 carry_out。固定位宽的结果只保留位宽内的位;无符号进位、有符号溢出和结果截断要分别报告。

加法器链:每一位的进位都要留下证据XOR 产生局部和,AND 产生生成进位,全加器合并传入进位1输入位a + b + carry门级证据2半加和XOR门级证据3生成进位AND门级证据4合并进位全加器链路边界5输出多位sum + carry位宽证据最高位进位、固定宽度截断和有符号溢出不是同一个判定
专属图示:从布尔门到进位链,再到位宽结果的加法器证据链。

五个节点到机制证据

输入位

先固定 abcarry_in,再逐位计算;不能把整型输入直接跳过门级关系。

半加和

a XOR b,同时还要产生 a AND b 的生成进位。它是理解全加器的局部构件,不是多位结果。

生成进位

表示 a AND b;即使当前位没有直接生成,也可能由传入进位继续传播。

合并进位

决定进位链能否跨越连续位;任何一位漏接都会在更高位形成可定位的首差。

输出多位

不是把无限精度整数直接打印出来。记录位宽、每位和、最高位进位、截断结果和溢出判定。

最小可重放实现

carry = 0
for bit in least_significant_to_most_significant:
    sum_bit = a[bit] xor b[bit] xor carry
    carry = (a[bit] and b[bit]) or (carry and (a[bit] xor b[bit]))
assert fixed_width_result == reference_result
assert reset() == baseline_trace

这段草图只表达逐位进位合同,不复制书中叙事或代码。实际复核应保存位宽、输入位、半加结果、生成/传入/传出进位、门输出、最终结果和复位结果。

五步复核一条多位加法

分步1 / 5

1. 固定位宽和输入位

记录无符号或有符号解释、位宽、每个操作数的二进制表示和初始 carry_in。先预测最低位的和与进位。

加法器链:每一位的进位都要留下证据XOR 产生局部和,AND 产生生成进位,全加器合并传入进位1输入位a + b + carry门级证据2半加和XOR门级证据3生成进位AND门级证据4合并进位全加器链路边界5输出多位sum + carry位宽证据最高位进位、固定宽度截断和有符号溢出不是同一个判定
专属图示:从布尔门到进位链,再到位宽结果的加法器证据链。

Lab

真值表与进位链实验

只改变一个输入或进位连接,观察首个错误位、位宽结果和溢出判定。

4 位输入 0011 + 0100,进位链按序归零

bit0..3 → sum=0111; carry_out=0; signed overflow=false

判定

通过:每位真值与多位输出一致

当前场景:基线加法;记录位宽、输入位、XOR/AND、carry_in、carry_out、截断与溢出。

正常、边界与故障证据

加法器证据矩阵:从最低位向最高位找首差正常看真值表,边界看进位和位宽,故障看门与链路观察项正常边界故障输入位序固定全 1位错XOR 正确连续进位门错进位链路连续最高位断线输出位宽一致截断/溢出结果错输入、门输出、进位连接和位宽判定共同解释最终数字
专属图示:逐位验证 XOR、AND、进位链与结果解释。
样本只改变的变量预期判定必存证据
正常真值表输入和进位连接完整每位和、进位与参考结果一致输入位、门输出、进位链、结果
边界位宽、连续进位、最高位符号或全 1 输入截断、无符号进位和溢出分别报告位宽、最高位、carry out、符号判定
故障一次门逻辑错误或进位线断开首个错误位可定位,修复后重放首差、输入、门输出、进位、复位

故障诊断:从最低位向最高位找首差

  1. 核对位宽与解释:确认二进制位序、补码/无符号模式和期望输出位宽,排除显示层误读。
  2. 核对半加门:比较每一位 XOR、AND 真值,找第一个不符合门合同的输出。
  3. 核对进位链:检查 carry_in 是否等于低一位 carry_out,找断线、反接或漏合并。
  4. 核对最高位判定:分别保存截断结果、无符号进位和有符号溢出,再从清零进位的基线重放。

术语表

名词解释

本章出现的专业名词,用大白话再讲一遍。

1.13 绕不开的加法器

由布尔门构成半加器与全加器,并由进位链产生固定位宽整数和的组合逻辑模型。

输入位

当前位的两个操作数位以及从低一位传入的进位位。

半加和

半加器对两个输入位执行 XOR 得到的和位,不包含传入进位。

生成进位

由当前位两个输入同时为 1 产生的 AND 进位。

合并进位

把局部结果和传入进位组合成全加器和与传出进位的阶段。

输出多位

按位宽收集各位和并分别解释截断、无符号进位与有符号溢出。

练习

练习

问题 1: 为什么 1 + 1 不能只用 XOR 得出最终结果?

问题 2: 最高位产生进位,是否一定表示有符号溢出?

问题 3: 多位加法结果只在某一个输入上错误,应该先检查哪里?

资料与写作方式声明

本章以码农翻身权威目录界定学习范围,并结合正文列出的技术资料独立重写;不宣称复现原书正文,也不沿用原作表述。

原作版权归作者与出版社所有;本站原创教学结构与表述仅供学习交流。

本页小结

1.13 绕不开的加法器的关键不是把加法看成一个神秘黑盒,而是能从输入位、半加和、生成进位、合并进位追踪到固定宽度输出。完成标准是区分无符号进位、截断和有符号溢出,在首个门逻辑或进位断点修复后,用真值表和干净复位证明结果一致。

讨论

评论区加载中…