整型加法

计算机中整型加法存在溢出问题,因为表示整数的位数是有限的。

无符号数加法

对于 位无符号数 ,其和 也可能超过

溢出时的行为

时,实际计算结果为:

即截断高位,只保留低 位。这相当于丢弃了进位。

溢出检测

无符号数加法发生溢出当且仅当计算结果小于两个加数中的任意一个:

unsigned u, v, sum = u + v;
int overflow = (sum < u);  // 或者 sum < v

原因:如果溢出,(因为 )。

有符号数加法(补码加法)

对于 位补码 ,其算术和可能超出补码的范围

三种情况

  1. 正常结果:算术和在范围内,结果等于算术和
  2. 正溢出(Positive Overflow),计算结果为
    • 两个正数相加得到负数(符号位由0变为1)
  3. 负溢出(Negative Overflow),计算结果为
    • 两个负数相加得到正数(符号位由1变为0)

溢出检测

  • 正溢出:,但结果
  • 负溢出:,但结果
int x, y, sum = x + y;
int pos_overflow = (x > 0 && y > 0 && sum <= 0);
int neg_overflow = (x < 0 && y < 0 && sum >= 0);

为什么补码加法是安全的

补码加法的硬件实现与无符号数加法完全相同——都是按位相加,抛弃进位。只是对结果的解读不同。这种设计使得同一个加法器电路可以同时服务于有/无符号数的加法。

相关笔记

链接到