-
什么是原碼、反碼和補碼
我們知道,在計算機內部存儲的帶符號數都是以補碼形式存儲,用補碼形式進行運算的,什么是一個數的補碼?為什么要用補碼?這要從數的原碼、反碼開始講。
-
原碼
為了可以表示正負性.使用最高為來表示這個數的正負性.
如果最高為是0 那么表示這個數是1個正數
如果最高為是1 那么表示這個數是1個負數.
所以,來表示數據的只有31位. 所以,1個int類型的變量
原碼
也叫 符號-絕對值碼
原碼簡單易懂
加減運算復雜
存在加減乘除四種與暗算
零的表示不唯一,存在+0 -0int a =-100; printf("a==\n\t原碼:\t%s\n\t補碼:\t%s\n", OriCodeA, NegCodeA); int b=100; printf("b==\n\t原碼:\t%s\n\t補碼:\t%s\n", OriCodeB, NegCodeB); unsigned int c=100; printf("b==\n\t原碼:\t%s\n\t補碼:\t%s\n", OriCodeC, NegCodeC); 結果: a== 原碼:10000000000000000000000001100100 補碼:11111111111111111111111110011100 b== 原碼: 00000000000000000000000001100100 補碼: 00000000000000000000000001100100 c== 原碼: 00000000000000000000000001100100 補碼: 00000000000000000000000001100100
-
最高位表示符號位. 剩下的位數.是這個數的絕對值的二進制
* ####反碼
正數的反碼就是其原碼.
負數的反碼就是在其原碼的基礎之上 符號位不變,其他位取反
* ####補碼
正數的補碼就是其原碼.
負數的補碼就是在其反碼的基礎之上+1
* ####二進制
我們都知道原碼反碼補碼就是二進制,只不過是二進制的不同變現形式
數據正是以補碼的形式儲存在計算機中
正數的原碼反碼補碼都是一樣,那么我們來說說負數的
比如 :數值到二進制
int a = -10;
那么轉成我們想要的二進制,也就是補碼有四步
第一步:
先求出10的原碼:0000 0000 0000 0000 0000 0000 0000 1010
第二步:
把符號位改成負數形勢:1000 0000 0000 0000 0000 0000 0000 1010
第三步:
求出反碼:1111 1111 1111 1111 1111 1111 1111 0101
第四步:
求補碼:1111 1111 1111 1111 1111 1111 1111 0110
這個就是你用計算機對應出來的二進制
又比如:二進制到數值
傳說中的 0x80000000,當然這個是指有符號的,無符號的沒什么好說的
先說下答案:-2147483648
之前我也是一臉懵逼,仔細學習了下后,說下自己的思路,不對請指出
這個0x80000000的二進制為:1000 0000 0000 0000 0000 0000 0000 0000
因為是有符號的,高位為1表示負數,那么低31為0 表示數值,excuse me? 那么這個值為-0,no,這也太不人之常情,于是,正確答案講解來了(我自己的理解,也不知道正不正確,嘗試幾個值都是對的)
這個0x80000000的二進制是補碼,那么想要得到它對應的數值,就得逆向從原碼到補碼,有三步
第一步:
求反碼:除符號位的補碼-1
還是:1000 0000 0000 0000 0000 0000 0000 0000
第二步:
求原碼:除符號位取反
1111 1111 1111 1111 1111 1111 1111 1111
第三步:
求數值:低31的二進制的值為2147483648,高位符號位為1則負數,那么是-2147483648