深入探讨整数的原码与补码
1.按位取反加一操作用数学公式如何表示?
假设对一个四位二进制数[D4 D3 D2 D1]进行按位取反操作
1111-[D4 D3 D2 D1]即是按位取反操作(1-0=1,即:将0取反;1-1=0,即:将1取反),
然后加上0001即表示加一
2^4=1111+0001
故,按位取反加一操作可以表示为:1111-[D4 D3 D2 D1]+0001=2^4-[D4 D3 D2 D1]
由上例可知,对一个n位二进制数进行按位取反加一操作可以用数学公式表示为:
2^n-[Dn D(n-1) .... D2 D1]
证明如下:
2^n=11...11(n个1)+00...01(n-1个0,1个1)
2^n-[Dn D(n-1) .... D2 D1]
=11...11(n个1)-[Dn D(n-1) .... D2 D1]+00...01(n-1个0,1个1)
11...11(n个1)-[Dn D(n-1) .... D2 D1]即是将[Dn D(n-1) .... D2 D1]按位取反
+00...01(n-1个0,1个1)即是加1操作
故,对一个n位二进制数进行按位取反加一的数学表达式为:2^n-[Dn D(n-1) .... D2 D1]
2.已知一个数的原码,如何求这个数的补码的数学表达式是?
设该数真值为m,绝对值为t,位数为n位
如果该数原码的符号位为0,此时m=t,则该数的补码就是原码,,数学表达式为
[m]补=[m]原=0,t(位数为n+1位)
如果该数原码的符号位为1,此时m=-t,则该数的补码的数学表达式为
[m]原=1,t
[m]补=2^(n+1)-0,t,
这个数学表达式的意思是
对0,t的每一位进行按位取反加一操作,即可得到[m]补,也是[-t]补
即:对原码除了符号位,其他位进行按位取反加一
3.已知一个数的补码,如何获取该数相反数的补码?
设该数的真值为x,该数用二进制表示有n位(没有符号位)
比如:一数的真值为111,该数的位数为3
情况1:若x>=0
x的原码和补码均为0,x(均是n+1位)
对[x]补进行按位取反加一操作,即2^(n+1)-[x]补=2^(n+1)-0,x
2^(n+1)-0,x正好是[-x]补
即:若要取一个正数的相反数的补码,仅需在将该正数的补码进行按位取反然后加一操作
情况2:若x<0
[x]原=1,fabs(x)
[x]补=2^(n+1)-0,fabs(x)
([x]补和[x]原均是n+1位)
对[x]补进行按位取反加一操作,即2^(n+1)-[x]补=2^(n+1)-(2^(n+1)-0,fabs(x))=0,fabs(x)
0,fabs(x)正好是[-x]补
综合情况1和情况2,已知一个数的补码,只需将该补码进行按位取反加一操作,即可获得该数相反数的补码。
4.请证明减去一个数的补码,等价于加上这个数相反数的补码。
将该问题分成两种情况讨论:
情况1:被减数为正数
情况2:被减数为负数
设M>=0,M是n位二进制数
情况1:被减数为正数
-[M]补=-(0,M)=-(0,M)+2^(n+1)=[-M]补
情况2:被减数为负数
-[-M]补=-((0,M)+2^(n+1))=-((0,M)+2^(n+1))+2^(n+1)=(0,M)=[M]补
总上述两种情况可知
-[x]补=[-x]补(X既可以是正数,也可以是负数)
5.模拟计算机加减法运算
进行加减法时,只会有两个运算,取相反数的补码和加法,做加法,会连同符号位一起做加法
设两个n为二进制数为M、N,M>=0,N>=0
1.模拟加法:
分三种情况讨论
1.正数+正数(不考虑溢出)
[M]补+[N]补=0,M+0,N=0,(M+N)
2.正数+负数
[M]补+[-N]补=0,M+(2^(n+1)-0,N)=2^(n+1)+0,M-0,N
若M>=N,则[M]补+[-N]补=2^(n+1)+0,M-0,N=0,(M-N)=[M-N]补
若M<N,则[M]补+[-N]补=2^(n+1)-0,fabs(M-N)=[M-N]补
3.负数+负数(不考虑溢出)
[-M]补+[-N]补=(2^(n+1)-0,M)+(2^(n+1)-0,N)
=2^(n+2)-(0,M+0,N)(mod 2^(n+1))
=2^(n+1)-(0,M+0,N)=[-(M+N)]补
2.模拟减法
分四种情况讨论
1.正数-正数
[M]补-[N]补=[M]补+[-N]补(参见加法的情况2)
2.正数-负数(不考虑溢出)
[M]补-[-N]补=[M]补+[N]补(参见加法的情况1)
3.负数-正数(不考虑溢出)
[-M]补-[N]补=[-M]补+[-N]补(参见加法的情况3)
4.负数-负数
[-M]补-[-N]补=[-M]补+[N]补(参见加法的情况2)
3.实例模拟
由上述的模拟加法和模拟减法知:只需考虑加法的情况即可
计算机做加法,会连同符号位一起做加法
设M、N为7位二进制正数,M=1001001=[73]二进制,N=0100100=[36]二进制,此时M>N
1.正数+正数
[M]补+[N]补=01001001+00100100=01101101=[M+N]补=[109]补
2.正数-负数
这里分两种情况
1.[M]补-[N]补=[M]补+[-N]补
[-N]补=11011100([N]补所有位按位取反加一)
[M]补+[-N]补=01001001+11011100=00100101=[M-N]补=[37]补
2.[N]补-[M]补=[N]补+[-M]补
[-M]补=10110111([M]补所有位按位取反加一)
[N]补+[-M]补=00100100+10110111=11011011=[-37]补
3.负数+负数
[-M]补+[-N]补
[-M]补=10110111([M]补所有位按位取反加一)
[-N]补=11011100([N]补所有位按位取反加一)
[-M]补+[-N]补=10010011=[-109]补