计算机系统第二章——整数运算

扩展&截断:针对于二进制的位向量
符号扩展:给定一个w位的有符号整数x
将其转换为(w+k)-bit的整数,保持值不变
规则:将x符号位复制k个
但是如果是无符号数,在前面直接加0就可以了
为什么补码的扩展只需要做符号扩展,值保持不变
答:w位二进制扩展成(w+k)位,补码范围变成了2(w+k),此时对负数x求补码变为2(w+k)-|x|(这是负数x对应的那个互补的正数)
之前的w位补码为2^w-|x|(这是负数x对应的那个互补的正数
2(w+k)-|x|-2w+|x|=2(w+k)-2w=2w(2k-1)
2k-1的二进制就是k个1,乘以2w就是左移w位,变成k个1 w个0
把原本w位的x补码加上去,刚好填充w个0,变成x补码的符号扩展形式

截断
截断的规则(例如从无符号整型变成无符号短整型
无符号/有符号:二进制位被截取
截断结果意义与之前不同,需重新解释
对无符号数来说就是取模运算mod
对有符号数来说类似取模运算
较小数值的截断结果比较符合预期

对于无符号数截断,截断到3位,对23取余,截断到k位,对2k取余
对于有符号数截断,截断到k位,先将其当做无符号数进行取余操作,再进行U2T操作(这是对k位进行操作)
要么用底权公式,要么-2^k

整数的运算操作
无符号数加法:
CF:有进位的话置一
假设字长为w位
如果有进位,只有将最高位舍弃,CF置一
通过取模运算来实现 s=(u+v)mod 2^w

补码加法:
UAdd与TAdd在位的操作上完全一致
但是解释的时候要用补码(有符号数)解释
所以下面这两个得到的结果是一致的
int s,t,u,v;
s=(int)((unsigned)u+(unsigned)v);
t=u+v;
s和t相等
如果补码加法有进位的话,舍弃最高位,把余下的位看做补码结果
溢出:结果小于-2(w-1)或大于等于2(w-1)
如果sum>=2^(w-1)补码结果为负数,为正溢出
导致结果减少16
例如0110(6)+0111(7)=1101(-3)
如果sum<-2^(w-1),补码结果为正数,为负溢出
例如1010+1100=0110(6)

有符号数减法
假设字长w=4
5-3=2
5的补码:0101
-3的补码:1101
5-3=5+(-3)=0101+1101=10010,有进位,舍弃最高位,实际结果为0010(2)

那么-5-1
假设字长w=4
-5的补码:1011
-1的补码:1111
-5-1=-5+(-1)=1011+1111=11010,有进位,舍弃最高位,实际结果为1010(-6)

乘法:
计算w位的两个数x和y的乘积(有无符号均可)
注意:结果可能会多于w位
无符号数:最大可以达到2w位:0<=xy<=(2w-1)2=2(2w)-2(w+1)+1
补码负的乘积最大可以到2w-1位:x
y>=(-2(w-1))*(2(w-1)-1)=-2(2w-2)+2(w-1)
补码正的乘积最大可以到2w位,仅对(TMin)2成立:x*y<=(-2(w-1))^2
所以为了得到完整的结果,得扩展
采用取模运算
(u*v)mod 2^w

2的幂次
u<<k得到u2^k
u<<5-u<<3=u
32-u8=u24
所以编译器总是自动将符合移位操作要求的乘法变成移位运算

除法:除数为无符号数中2的幂次时,商的计算如下:
u>>k gives[u/2^k]
使用逻辑右移
x=15213 二进制表示为00111011 01101101
x>>1 原本是7606.5 结果为7606,下取整, 00011101 10110110
除数为有符号数中2的幂次时,商的计算如下
使用算数右移,也是下取整
x>>k 结果x/2^k下取整

除法的矫正
被除数为负,除数为2的幂次
需要x/2^k向0取整
计算(x+2k-1)/2k下取整,更加贴近十进制结果

也就是如果被除数是负数,我们就要加上2k-1再除2k
不是负数就直接除

sizeof()是无符号数

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值