C語言專題-原碼、反碼與補碼

  • 什么是原碼、反碼和補碼

    我們知道,在計算機內部存儲的帶符號數都是以補碼形式存儲,用補碼形式進行運算的,什么是一個數的補碼?為什么要用補碼?這要從數的原碼、反碼開始講。

    • 原碼

    為了可以表示正負性.使用最高為來表示這個數的正負性.
    如果最高為是0 那么表示這個數是1個正數
    如果最高為是1 那么表示這個數是1個負數.
    所以,來表示數據的只有31位. 所以,1個int類型的變量
    原碼
    也叫 符號-絕對值碼
    原碼簡單易懂
    加減運算復雜
    存在加減乘除四種與暗算
    零的表示不唯一,存在+0 -0

    int 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

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容