整数运算
无符号加法
-
两个非负整数的加法很有可能会导致溢出
-
两数相加后,丢弃超越范围的数字,得到的结果类似于模运算
-
例如9 + 12 = .21 = [10101] => [0101] = 5 = 21 % 16
-
丢弃最高位相当于从和中减去2^w(无符号)
-
C语言不会因为溢出而发出信号
-
检测溢出的方法:s = x + y(截取后), 若s < x或s < y,则发生了溢出
-
(不是很理解)阿贝尔群:对于无符号数,必有y使得x + y = 0(均限定在一定字节内),则y = (x = 0) => x; (x > 0) => 2^w - x
-
(x + y) - x总能求到y,与是否溢出无关
补码加法
-
使用截断的方法避免数据大小的不断扩张
-
正溢出,则结果为负数
-
负溢出,则结果为正数
x + y = {
x + y − 2 w 正 溢 出 x + y - 2^w 正溢出 x+y−2w正溢出
x + y 正 常 x + y 正常 x+y正常
x + y + 2 w 负 溢 出 x + y + 2^w 负溢出 x+y+2w负溢出
} -
大部分机器使用一模一样的指令执行无符号或者有符号的加法
-
将参数转换为无符号数,执行无符号数加法,再转化为补码
x + y = U2Tw[(x + y) mod 2^w] -
检测补码加法溢出方法
s = x + y s = x + y s=x+y
x > 0 && y > 0 && s <= 0 => 正溢出
x < 0 && y < 0 && s >= 0 => 负溢出 -
总结:x、y同号且不等于0时,s == 0,或s与x、y任意异号,则溢出
补码的非
-
TMin <= x <= TMax中,x的非:
{
x = T M i n = > T M i n x = TMin => TMin x=TMin=>TMin
x > T M i n = > − x x > TMin => -x x>TMin=>−x
} -
对w位的补码加法,TMin是加法的逆
-
其它任意数值的x,都有-x作为加法的逆(整数非)
-
补码非的位级表示
- −