1. 程式人生 > >二進位制的原碼、反碼、補碼和程式超出整型限制時的運算

二進位制的原碼、反碼、補碼和程式超出整型限制時的運算

二進位制的原碼、反碼、補碼和程式超出整型限制時的運算

1.二進位制的原碼、反碼和補碼運算 

    原碼錶示法:原碼錶示法是機器數的一種簡單表示法。其符號位用0表示正數,用1表示負數,數值一般用二進位制形式表示。原碼在進行加減法運算時,符號位不能直接參與運算,而是要分別計算符號位和數值位。當數字為正數時,直接進行二進位制運算;當數字為負數時,要轉換成補碼進行運算。得到的結果為正數,則為最後結果,如果為負數,則符號位不變,進行減1,取反操作,得到最後結果。

(1)正數:二進位制原碼、反碼和補碼都相同,為原碼形式。

(2)負數:原碼為它的二進位制數,反碼為原碼的符號位不變,其餘各位取反,補碼為其反碼在最低位加1。

例1:當機器字長為8位二進位制數時,進行加法運算5+3。

    因兩數都為正數,直接採用原碼形式進行運算

    5的原碼:0000 0101

    3的原碼:0000 0011

    5+3:0000 0101+0000 0011=0000 1000=8

例2:當機器字長為8位二進位制數時,進行減法運算-5-3。

    因存在負數參與運算,所以要取負數的補碼進行運算

    -5的原碼:1000 0101,反碼:1111 1010,補碼:1111 1011

    -3的原碼:1000 0011,反碼:1111 1100,補碼:1111 1101

    -5-3=(-5)+(-3):1111 1011+1111 1101=1111 1000,其中所得結果為負數,要保持符號位不變,進行減1取反操作,得到

最後結果,為1000 1000,即-8。

2.程式超過整型限制時的運算

    整型大致分為有符號和無符號兩種,無符號整型的優點是可以增大變數能夠儲存的最大值。

例:

#include <iostream>
#include <climits>
int main()
{
	using namespace std;
	short int signed_flag = SHRT_MAX;
	unsigned short int unsigned_flag = SHRT_MAX;
 
	signed_flag = signed_flag + 1;
	unsigned_flag = unsigned_flag + 1;
 
	cout << "signed_flag = " << signed_flag << endl;
	cout << "unsigned_flag = " << unsigned_flag << endl;
 
	signed_flag = 0;
	unsigned_flag = 0;
 
	signed_flag = signed_flag - 1;
	unsigned_flag = unsigned_flag - 1;
 
	cout << "signed_flag = " << signed_flag << endl;
	cout << "unsigned_flag = " << unsigned_flag << endl;
}
執行結果:

注:在此係統上,short int 最大值為32767。對於有符號 short int 來說,當為最大值時,加1超過了限制,其值將變為範圍的另一端;對於無符號 short int 來說,當為0時,減1超過了限制,其值也將變為範圍的另一端。