2.3 整数运算
2.3.1 无符号数加法
原理:无符号数加法
对于0≤x,y<2w:x+wuy=⎩⎨⎧x+y,x+y−2w,x+y<2w2w≤x+y<2w+1正常溢出(2.11)e.g:对于四位数的加法有0x0B+0x0C=0x17(溢出)=0x7
原理:检测无符号数加法中的溢出
对于0≤x,y<UMaxw:(x+wuy)<x∣∣(x+wuy)<y,则发生了溢出。
原理:无符号数求反
对于任意x必然存在某个值−wux满足−wux+wux=0。对于0≤x<2w:−wux=⎩⎨⎧x,2w−x,x=0x>0(2.12)
推导:无符号数求反
x=0⟸0+0=02w−x⟸0<2w−x<2w⟸(x+2w−x)mod2w=2wmod2w=0
2.3.2 补码加法
原理:补码加法
对于−2w−1≤x,y≤2w−1−1:x+wty=⎩⎪⎪⎪⎪⎨⎪⎪⎪⎪⎧x+y−2w,x+y,x+y+2w,2w−1≤x+y−2w−1≤x+y<2w−1x+y<−2w−1正溢出正常负溢出(2.13)
推导:补码加法
x+wty=˙U2Tw(T2Uw(x)+wuT2Uw(y))(2.14)据等式(2.6)B2Uw(T2Bw(x))=T2Uw(x)=x+xw−12w(2.6)⟹T2Uw(x)=xw−12w+xT2Uw(y)=yw−12w+yx+wty=˙U2Tw(T2Uw(x)+wuT2Uw(y))⟹U2Tw[(xw−12w+x+yw−12w+y)mod2w]⟹U2Tw[(x+y)mod2w]令z=˙x+y,z′=˙zmod2w,z′′=˙U2Tw(z′)=x+wty。情况1:−2w≤z<−2w−1z′=z+2w⟹0≤z′<−2w−1+2w=2w−1检查等式(2.7)0≤u≤UMaxw=˙i=0∑w−12i=2w−1:U2Tw(u)=⎩⎨⎧u,u−2w,u≤TMaxwu>TMaxw(2.7)TMaxw=˙i=0∑w−12i=2w−1−1TMinw=˙−2w−1有0≤z′<2w:U2Tw(z′)=⎩⎨⎧z′,z′−2w,z′≤TMaxwz′>TMaxw⟹z′′=z′=z+2w=x+y+2w>0负溢出(negative overflow)情况2:−2w≤z<0z′=z+2w⟹−2w−1+2w=2w−1≤z′<2w检查等式(2.7)0≤u≤UMaxw=˙i=0∑w−12i=2w−1:U2Tw(u)=⎩⎨⎧u,u−2w,u≤TMaxwu>TMaxw(2.7)TMaxw=˙i=0∑w−12i=2w−1−1TMinw=˙−2w−1有2w−1≤z′<2w:U2Tw(z′)=⎩⎨⎧z′,z′−2w,z′≤TMaxwz′>TMaxw⟹z′′=z′−2w=x+y+2w−2w=x+y情况3:0≤z<2w−1z′=z⟹0≤z′<2w−1⟹z′′=z′=z=x+y情况4:2w−1≤z<2wz′=z⟹2w−1≤z′<2w⟹z′′=z′−2w=x+y−2w<0正溢出(positive overflow)e.g.:⎩⎪⎨⎪⎧x=−8=[1000],y=−5=[1011],⟹⎩⎪⎨⎪⎧x+y=−13=[10011],x+4ty=3=[0011],情况1
原理:检测补码加法的溢出
TMinw≤x,y≤TMaxw,s=˙x+wty⇓⎩⎪⎨⎪⎧x>0,y>0,s≤0⟹x<0,y<0,s≥0⟹正溢出负溢出
2.2.3 补码的非
原理:补码的非
TMinw≤x≤TMaxw⇓−wtx=⎩⎪⎨⎪⎧TMinw,−x,x=TMinwx>TMinw(2.15)tips:−wtx=~x+1e.g.:x
=[0101]⟹−wtx=~x
+1=[1010]+1=−6+1=−5x
=[0111]⟹−wtx=~x
+1=[1000]+1=−8+1=−7特别的,当x
=
0,k≥0⇓x
=[xw−1,xw−2,...,xk+1,1,0,...,0]⇓−wtx
=[~xw−1,~xw−2,...,~xk+1,1,0,...,0]⇓e.g.:x
=[0101]⟹−wtx=[1011]=−5x
=[0111]⟹−wtx=[1001]=−7
2.3.4 无符号乘法
原理:无符号乘法
0≤x,y≤UMaxw⇓x∗wuy=(x⋅y)mod2w(2.16)
2.3.5 补码乘法
原理:补码乘法
TMinw≤x,y≤TMaxw⇓x∗wuy=U2Tw((x⋅y)mod2w)(2.17)
原理:无符号和补码乘法的位级等价性
令x=B2Tw(x
),y=B2Tw(y
)x′=B2Uw(x
),y′=B2Uw(y
)⟹T2Bw(x∗wty)=U2Bw(x∗wty)e.g.:
推导:无符号和补码乘法的位级等价性
B2Uw(T2Bw(x))=T2Uw(x)=x+xw−12w(2.6)⇓x′=x+xw−12w,y′=y+yw−12w⟹(x′⋅y′)=[(x+xw−12w)⋅(y+yw−12w)]mod2w=[x⋅y+(xw−1y+yw−1x)2w+xw−1yw−122w]mod2w=(x⋅y)mod2w(2.18)⟹T2Uw(x∗wty)=T2Uw(U2Tw(x⋅y)mod2w)=(x⋅y)mod2w⟹U2Bw(T2Uw(x∗wty))=T2Bw(x∗wty)=U2Bw(x′∗wty′)e.g.:[101]∗[011]=5∗3=15=[001111]⟹[111]=7[101]∗[011]=−3∗3=−9=[110111]⟹[111]=−1
2.3.6 乘以常数
推导:乘以2的幂
B2Uw+k([xw−1,xw−2,...,x0,0,...,0])=i=0∑w−1xi2i+k=[i=0∑w−1xi2i]⋅2k=x2ke.g.:x4=[1011]=11,x4+2=x4<<2=[101100]=44
原理:与2的幂相乘的无符号乘法
0≤k<w⟹(x<<k)=x∗wu2k
原理:与2的幂相乘的补码乘法
0≤k<w⟹(x<<k)=x∗wt2k
归纳:
x∗K⇓K⟹[...(0...0)(1a...1b)(0...0)(1n...1m)...]n≥m,b≥atypeA:(x<<b)+(x<<(b−1))+...+(x<<a)+(x<<n)+(x<<(n−1))+...+(x<<m)typeB:(x<<(b+1))−(x<<a)+(x<<(n+1))−(x<<m)tips:a=2w−1⟹x<<(a+1)=0e.g.:K=−5=[1011]⟹0−x−(x<<2)K=55=[110111]⟹(x<<6)−(x<<2)−xK=6=[0110]⟹(x<<2)+(x<<1)
2.3.7 除以2的幂
整数除法总是舍入到零。
a∈R,Intergea′=⌊a⌋⟹a′≤a<a′+1Intergea′=⌈a⌉⟹a′−1≤a<a′e.g.:⌊3.14⌋=3,⌊−3.14⌋=−4
原理:除以2的幂的无符号除法
0≤k<w⇓x>>k=⌊x/2k⌋
推导:除以2的幂的无符号除法
x=[xw−1,xw−2,...,x0],x′=xw−k=[xw−1,xw−2,...,xk],0≤k<wx′′=xk−1=[xk−1,xk−2,...,x0]⇓x=2kx′+x′′,0≤x′′<2k。⟹⌊x/2k⌋=x′⟹[xw−1,xw−2,...,x0]>>k=[0,...,0,xw−1,xw−2,...,xk],
原理:除以2的幂的补码除法
0≤k<w⇓x>>k=⌊x/2k⌋
推导:除以2的幂的补码除法,向下舍入
x=[xw−1,xw−2,...,x0],x′=xw−k=[xw−1,xw−2,...,xk],0≤k<wx′′=xk−1=[xk−1,xk−2,...,x0]⇓x=2kx′+x′′,0≤x′′<2k。⟹⌊x/2k⌋=x′⟹[xw−1,xw−2,...,x0]>>k=[xw−1,...,xw−1,xw−1,xw−2,...,xk],e.g.:[1100111111001100]>>4=[1111110011111100]=⌊−771.25⌋=−772
原理:除以2的幂的补码除法,向上舍入
0≤k<w⇓(x+(1<<k)−1)>>k=⌊x/2k⌋
推导:除以2的幂的补码除法,向上舍入
⌈x/y⌉=⌊(x+y−1)/y⌋,令x=qy+r,0≤r<y⇓(x+y−1)/y=q+(r+y−1)/y⟹⌊(x+y−1)/y⌋=q+⌊(r+y−1)/y⌋=⎩⎪⎨⎪⎧q,q+1,r=0r>0C表达式:(x<0?x+(1<<k)−1:x)>>ke.g.:([1100111111001100]+(1<<4)−1)>>4=[1100111111011011]>>4=[1111110011111101]=⌊−771.25⌋=−771