对于补码加法的理解(csapp)

补码加法

1.分析

类似于十进制加法,对于两个w位的二进制位模式相加,可以得到另一个位模式(可能为w位,也可为w+1位)

两个数的w位补码之和与无符号之和有相同的位级表示(二进制的加法运算是相同的,补码加法和无符号加法对溢出的处理也是相同的——截断,只是对二进制结果的解释不同)

例如:1011 1101 (补码:-5 -3 无符号:11 13)
  1011
+ 1101
--------
 11000
截断为4位:1000(补码:-8 无符号:8)

所以我们可以在无符号加法的基础上得到补码加法,即对于两个有符号数的加法,可以先使用 T 2 U w T2U_w T2Uw转换位无符号数,使用 + w u +_w^u +wu,得到无符号数的结果,再使用 U 2 T w U2T_w U2Tw转换成有符号数,这样就得到了补码加法的结果

2.公式推导

对于两个w位的有符号数x、y, − 2 w − 1 ≤ x + y ≤ 2 w − 1 − 1 -2^{w -1}\leq x+y \leq 2^{w-1} - 1 2w1x+y2w11 − 2 w ≤ x + y ≤ 2 w − 2 -2^w\leq x+y \leq 2^w - 2 2wx+y2w2,有 2 w + 1 − 1 2^{w+1} - 1 2w+11个数,故需要 w + 1 w + 1 w+1位进行表示,对于补码加法一般是直接将x+y的结果截断位w位表示,则有
         x + w t y = U 2 T w [ ( T 2 U w ( x ) + T 2 U w ( y ) ) m o d 2 w ] (补码截断为 w 位的公式) = U 2 T w [ ( x w − 1 2 w + x + y w − 1 2 w + y ) m o d 2 w ] (补码转无符号公式) = U 2 T w [ ( x + y ) m o d 2 w ] \begin {align} &\,\,\,\,\,\,\,\,x+_w^t y = U2T_w\left[\left(T2U_w(x) +T2U_w(y)\right) mod2^w\right](补码截断为w位的公式)\\[1ex] &=U2T_w\left[\left(x_{w-1}2^w+x + y_{w-1}2^w + y\right)mod2^w\right](补码转无符号公式)\\[1ex] &=U2T_w\left[\left(x+y\right)mod2^w\right]\\[2ex] & \end {align} x+wty=U2Tw[(T2Uw(x)+T2Uw(y))mod2w](补码截断为w位的公式)=U2Tw[(xw12w+x+yw12w+y)mod2w](补码转无符号公式)=U2Tw[(x+y)mod2w]
在这里插入图片描述

  • 对于无符号数加法来说,如果 x + y x+y x+y没有溢出,则 x + w u y = x + y x+_w^uy = x + y x+wuy=x+y,不需要进行处理,因为无符号没有溢出,相当于第 w + 1 w+1 w+1位为0,截断第 w + 1 w+1 w+1位对于没有溢出的无符号加法的结果并没有影响;但是对于补码加法来说, x + y x+y x+y没有溢出, x + w t ≠ x + y x+_w^t \neq x+y x+wt=x+y,因为 x + y x+y x+y没有溢出,不等于第 w + 1 w+1 w+1位为0,所以截断第 w + 1 w+1 w+1位,无论有没有溢出都有影响,因此需要分情况进行讨论:
  • − 2 w ≤ x + y < − 2 w − 1 -2^w\leq x+y < -2^{w - 1} 2wx+y<2w1
    • ( x + y ) m o d 2 w = x + y + 2 w (x+y)mod2^w = x+y+2^w (x+y)mod2w=x+y+2w(对于负数,w+1位为1,截断为 w w w位表示,即 + 2 w +2^w +2w),所以 0 ≤ ( x + y ) m o d 2 w < 2 w − 1 0\leq(x+y)mod2^w<2^{w-1} 0(x+y)mod2w<2w1
    • ( x + y ) m o d 2 w (x+y)mod2^w (x+y)mod2w的结果为无符号数,所以需要使用 U 2 T w U2T_w U2Tw转换为有符号数,
    • 又因为 ( x + y ) m o d 2 w ≤ T M a x w = 2 w − 1 − 1 (x+y)mod2^w\leq TMax_w=2^{w-1}-1 (x+y)mod2wTMaxw=2w11,所以 U 2 T w [ ( x + y ) m o d 2 w ] = x + y + 2 w U2T_w[(x+y)mod2^w] = x+y+2^w U2Tw[(x+y)mod2w]=x+y+2w,即 x + w t y = x + y + 2 w x+_w^ty = x+y+2^w x+wty=x+y+2w
  • − 2 w − 1 ≤ x + y < 0 -2^{w - 1}\leq x+y<0 2w1x+y<0
    • ( x + y ) m o d 2 w = x + y + 2 w (x+y)mod2^w = x+y+2^w (x+y)mod2w=x+y+2w(对于负数,w+1位为1,截断为 w w w位表示,即 + 2 w +2^w +2w),所以 2 w − 1 ≤ ( x + y ) m o d 2 w < 2 w 2^{w-1}\leq(x+y)mod2^w<2^{w} 2w1(x+y)mod2w<2w
    • ( x + y ) m o d 2 w (x+y)mod2^w (x+y)mod2w的结果为无符号数,所以需要使用 U 2 T w U2T_w U2Tw转换为有符号数,
    • 又因为 ( x + y ) m o d 2 w > T M a x w = 2 w − 1 − 1 (x+y)mod2^w> TMax_w=2^{w-1}-1 (x+y)mod2w>TMaxw=2w11,所以 U 2 T w [ ( x + y ) m o d 2 w ] = x + y + 2 w − 2 w U2T_w[(x+y)mod2^w] = x+y+2^w-2^w U2Tw[(x+y)mod2w]=x+y+2w2w,即 x + w t y = x + y x+_w^ty = x+y x+wty=x+y
  • 0 ≤ x + y < 2 w − 1 0\leq x+y < 2^{w-1} 0x+y<2w1
    • ( x + y ) m o d 2 w = x + y (x+y)mod2^w = x+y (x+y)mod2w=x+y(对于正数,w+1位为0,截断为 w w w位表示,没有影响),所以 0 ≤ ( x + y ) m o d 2 w < 2 w − 1 0\leq(x+y)mod2^w<2^{w-1} 0(x+y)mod2w<2w1
    • ( x + y ) m o d 2 w (x+y)mod2^w (x+y)mod2w的结果为无符号数,所以需要使用 U 2 T w U2T_w U2Tw转换为有符号数,
    • 又因为 ( x + y ) m o d 2 w ≤ T M a x w = 2 w − 1 − 1 (x+y)mod2^w\leq TMax_w=2^{w-1}-1 (x+y)mod2wTMaxw=2w11,所以 U 2 T w [ ( x + y ) m o d 2 w ] = x + y U2T_w[(x+y)mod2^w] = x+y U2Tw[(x+y)mod2w]=x+y,即 x + w t y = x + y x+_w^ty = x+y x+wty=x+y
  • 2 w − 1 ≤ x + y < 2 w 2^{w-1}\leq x+y<2^w 2w1x+y<2w
    • ( x + y ) m o d 2 w = x + y (x+y)mod2^w = x+y (x+y)mod2w=x+y(对于正数,w+1位为0,截断为 w w w位表示,没有影响),所以 2 w − 1 ≤ ( x + y ) m o d 2 w < 2 w 2^{w-1}\leq (x+y)mod2^w<2^w 2w1(x+y)mod2w<2w
    • ( x + y ) m o d 2 w (x+y)mod2^w (x+y)mod2w的结果为无符号数,所以需要使用 U 2 T w U2T_w U2Tw转换为有符号数,
    • 又因为 ( x + y ) m o d 2 w > T M a x w = 2 w − 1 − 1 (x+y)mod2^w> TMax_w=2^{w-1}-1 (x+y)mod2w>TMaxw=2w11,所以 U 2 T w [ ( x + y ) m o d 2 w ] = x + y − 2 w U2T_w[(x+y)mod2^w] = x+y-2^w U2Tw[(x+y)mod2w]=x+y2w,即 x + w t y = x + y − 2 w x+_w^ty = x+y-2^w x+wty=x+y2w

在这里插入图片描述

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值