-
什么是原碼调衰、反碼和補碼
我們知道,在計算機內(nèi)部存儲的帶符號數(shù)都是以補碼形式存儲,用補碼形式進行運算的,什么是一個數(shù)的補碼?為什么要用補碼?這要從數(shù)的原碼、反碼開始講自阱。
-
原碼
為了可以表示正負性.使用最高為來表示這個數(shù)的正負性.
如果最高為是0 那么表示這個數(shù)是1個正數(shù)
如果最高為是1 那么表示這個數(shù)是1個負數(shù).
所以,來表示數(shù)據(jù)的只有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); 結(jié)果: a== 原碼:10000000000000000000000001100100 補碼:11111111111111111111111110011100 b== 原碼: 00000000000000000000000001100100 補碼: 00000000000000000000000001100100 c== 原碼: 00000000000000000000000001100100 補碼: 00000000000000000000000001100100
-
最高位表示符號位. 剩下的位數(shù).是這個數(shù)的絕對值的二進制
* ####反碼
正數(shù)的反碼就是其原碼.
負數(shù)的反碼就是在其原碼的基礎(chǔ)之上 符號位不變,其他位取反
* ####補碼
正數(shù)的補碼就是其原碼.
負數(shù)的補碼就是在其反碼的基礎(chǔ)之上+1
* ####二進制
我們都知道原碼反碼補碼就是二進制,只不過是二進制的不同變現(xiàn)形式
數(shù)據(jù)正是以補碼的形式儲存在計算機中
正數(shù)的原碼反碼補碼都是一樣沛豌,那么我們來說說負數(shù)的
比如 :數(shù)值到二進制
int a = -10;
那么轉(zhuǎn)成我們想要的二進制趋箩,也就是補碼有四步
第一步:
先求出10的原碼:0000 0000 0000 0000 0000 0000 0000 1010
第二步:
把符號位改成負數(shù)形勢:1000 0000 0000 0000 0000 0000 0000 1010
第三步:
求出反碼:1111 1111 1111 1111 1111 1111 1111 0101
第四步:
求補碼:1111 1111 1111 1111 1111 1111 1111 0110
這個就是你用計算機對應出來的二進制
又比如:二進制到數(shù)值
傳說中的 0x80000000,當然這個是指有符號的琼懊,無符號的沒什么好說的
先說下答案:-2147483648
之前我也是一臉懵逼阁簸,仔細學習了下后,說下自己的思路哼丈,不對請指出
這個0x80000000的二進制為:1000 0000 0000 0000 0000 0000 0000 0000
因為是有符號的启妹,高位為1表示負數(shù),那么低31為0 表示數(shù)值醉旦,excuse me饶米? 那么這個值為-0,no,這也太不人之常情车胡,于是檬输,正確答案講解來了(我自己的理解,也不知道正不正確匈棘,嘗試幾個值都是對的)
這個0x80000000的二進制是補碼丧慈,那么想要得到它對應的數(shù)值,就得逆向從原碼到補碼主卫,有三步
第一步:
求反碼:除符號位的補碼-1
還是:1000 0000 0000 0000 0000 0000 0000 0000
第二步:
求原碼:除符號位取反
1111 1111 1111 1111 1111 1111 1111 1111
第三步:
求數(shù)值:低31的二進制的值為2147483648逃默,高位符號位為1則負數(shù),那么是-2147483648