无需登录 数据私有 本地保存

二进制补码加法器 - 显示标志位和溢出

14
0
0
0
二进制补码加法器
Two's Complement Adder — 标志位 & 溢出检测
位宽:
操作数 A
⚠ 值超出指定位宽范围
补码形式: 0101
操作数 B
⚠ 值超出指定位宽范围
补码形式: 1101
加法运算过程
计算结果
2 (有符号) | 2 (无符号)
原始二进制: 0010
处理器标志位
CF
进位标志
0
OF
溢出标志
0
SF
符号标志
0
ZF
零标志
0
PF
奇偶标志
0
AF
辅助进位
0
快速示例
常见问题与知识点
什么是二进制补码(Two's Complement)?
二进制补码是计算机中表示有符号整数的最常用方法。对于一个n位二进制数,其最高位(MSB)为符号位:0表示正数,1表示负数。正数的补码就是其本身的二进制表示;负数的补码是其绝对值的二进制按位取反后加1。例如8位下,-3的补码为:3的二进制00000011 → 取反11111100 → 加1得11111101。补码的优点是加法和减法可以用同一套电路处理,硬件实现简单高效。
补码加法是如何工作的?
补码加法直接将两个数的补码形式相加,包括符号位也参与运算。相加时按位进行,从最低位开始逐位向上进位。最终结果如果超出了n位,最高位的进位会被丢弃(但在标志位中会保留为CF进位标志)。这种"丢弃"恰好使得补码加法能够正确处理正负数混合运算。例如8位下:(-3)+(5) → 11111101 + 00000101 = 00000010(进位1被丢弃),结果2正确。
溢出(Overflow)是什么?如何检测?
溢出发生在两个有符号数相加的结果超出了指定位宽所能表示的范围。检测方法:当两个操作数的符号位相同,但结果的符号位与它们不同时,发生溢出。即:两个正数相加得到负数,或两个负数相加得到正数。硬件上通过 OF = Carryn XOR Carryn-1(最高位进位与次高位进位异或)来检测。溢出意味着结果不正确,需要更大位宽来表示。
进位标志(CF)和溢出标志(OF)有什么区别?
CF(Carry Flag)指示无符号运算是否超出范围,即最高位是否有进位输出;OF(Overflow Flag)指示有符号运算是否超出范围。两者是独立的!例如8位:(-1)+(-1)=11111111+11111111=11111110(CF=1有进位,OF=0无溢出,结果-2正确)。又如8位:127+1=01111111+00000001=10000000(CF=0无进位,OF=1有溢出,结果-128错误)。
辅助进位标志(AF)有什么用途?
AF(Auxiliary Carry Flag)指示低4位(bit0-bit3)向bit4是否有进位,即第3位向第4位的进位。AF主要用于BCD(二进制编码十进制)运算的调整。在x86处理器中,DAA和DAS指令利用AF来进行BCD修正。对于4位位宽,AF等同于CF。AF = ((A & 0xF) + (B & 0xF)) >> 4,即低4位相加是否产生向第5位的进位。
奇偶标志(PF)的含义是什么?
PF(Parity Flag)指示运算结果中1的个数是否为偶数。在x86架构中,PF只检查结果低8位中1的个数。如果1的个数为偶数,PF=1;奇数则PF=0。这个标志源于早期用于数据校验的需求,现在在某些场合仍用于快速奇偶判断。本工具中,PF检查指定位宽内所有位中1的个数。
为什么计算机使用补码而不是原码?
原码(最高位为符号位,其余位为绝对值)在加减运算时需要根据符号分别处理,电路复杂且有±0的问题。补码只有一个0(所有位为0),且减法可以通过加上减数的补码来实现(A-B = A+(-B)),使得CPU只需要加法器就能完成加法和减法,大大简化了硬件设计。这是现代计算机无一例外采用补码的根本原因。