整数的运算

加法

补码
结果保持w位,模运算。(会截断)28=256

1+127 => -128(即0000 0001+0111 1111=1000 0000)(即128-28)
-128±1 => 127(即 1000 0000+1111 1111=0111 1111)(即 -129+28=127)

if (x>=0)+(wty>=0)<0,即正溢出,结果:x+y-2w(最高位变1,负数)
if (x>=0)+(wty>=0)>0,即负溢出,结果:x+y+2w(最高位变0,正数)

没有溢出:-2w-1<=x+y<=2w-1 =>x+wty=x+y

无符数

/*判断无符数相加是否溢出*/
int uadd_ok(unsigned x, unsigned y)
{
unsigned sum=x+y;
if(sum>=x)return 1;
else return 0;

}

() x和y都大于零又小于2w,x+y的和sum肯定大于x或者y,溢出时,y-2w小于零。∴x+y-2w肯定小于x或y

加法逆元
x+x’=x’+x=0(相反数定义)
y-x → y+x’
无符号数 x和x’(逆元)都是正数
but x+x’=2w=0(-0) 通过溢出等于0

-wux=x (x=0)
-wux=2w-x (x>=0)

有符号数
-wtx=-x (x>Tmin)
-wtx=Tmin (x=Tmin)即x等于Tmin时,逆元是它本身(负溢出实现)

最小值最大值不对称→|TMin|=|TMax|+1
为什么补码最小值Tminw是本身?
Tminw+Tminw=-2w-1+ -2w-1= -2w
Tminw+wtTminw= -2w+ 2w= 0

乘法

补码
保持w位,(0~w-1位)
补码乘法比无符号数多一步:需要将无符号数转换为补码U2Tw((x·y)mod2w)
假设x和x’ y和y’的二进制表示相同,xy是有符数,x’y’是无符数
x’=x+ xw-1 · 2w
y’=y+ yw-1 · 2w
(x·y)mod2w=[(x+ xw-1 · 2w )(y+ yw-1 · 2w)]mod2w

B2Uw(x’)-B2Tw(x)=xw-1·2w (有符数和无符数关系公式)

(x’·y’)mod2w=(x·y)mod2w

x·2→x<<1
x·4→x<<2
x·2k→x<<k
x*14:
14=23+22+21
x·14=(x<<3)+(x<<2)+(x<<1)
=(x<<4)-(x<<1)

除法

无符号数:逻辑右移
有符号数:算术右移,补1/0
无符号数:
除不尽:向0舍入
x>=0 y>0 x/y向下舍入
x<=0 y>0 x/y向上舍入
x>>k → x/2k
补码

k>>k(binary)Decimal12340/2k
01100 1111 1100 1100-12340-12340.0
11100 1111 1100 1100-6170-6170.0
41111 1100 1111 1100772(期望得到771)771.25
kBias>>k(binary)Decimal12340/2k
001100 1111 1100 1100-12340-12340.0
111100 1111 1100 1100-6170-6170.0
4151111 1100 1111 1100772(期望得到771)771.25
(x<0?x+(1<<k)-1:x)>>k
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值