加法
补码:
结果保持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) | Decimal | 12340/2k |
---|---|---|---|
0 | 1100 1111 1100 1100 | -12340 | -12340.0 |
1 | 1100 1111 1100 1100 | -6170 | -6170.0 |
4 | 1111 1100 1111 1100 | 772(期望得到771) | 771.25 |
k | Bias | >>k(binary) | Decimal | 12340/2k |
---|---|---|---|---|
0 | 0 | 1100 1111 1100 1100 | -12340 | -12340.0 |
1 | 1 | 1100 1111 1100 1100 | -6170 | -6170.0 |
4 | 15 | 1111 1100 1111 1100 | 772(期望得到771) | 771.25 |
(x<0?x+(1<<k)-1:x)>>k