天天看點

深入探讨整數的原碼與補碼深入探讨整數的原碼與補碼

深入探讨整數的原碼與補碼

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]補
           

繼續閱讀