二進位制的原碼、反碼、補碼和程式超出整型限制時的運算
二進位制的原碼、反碼、補碼和程式超出整型限制時的運算
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超過了限制,其值也將變為範圍的另一端。