1. 程式人生 > >原碼、反碼和補碼概述

原碼、反碼和補碼概述

原碼:原碼是計算機中對數字的二進位制表示方法,原碼的最高位是符號位,0表示正數,1表示負數。

反碼:反碼是數值儲存的一種,多應用於系統環境設定,如linux平臺的目錄和檔案的預設許可權的設定umask,就是使用反碼原理。反碼的計算是原碼的符號位不動,其餘的取反。

補碼:在計算機系統中,數值一律用補碼來表示和儲存。補碼的計算區分正負數,正數的補碼和原碼相同,負數的補碼是符號位不變,反碼加1。

例子:

  • -6:
    • 原碼:10000110
    • 反碼:11111001
    • 補碼:11111010
  • -1:
    • 原碼:10000001
    • 反碼:11111110
    • 補碼:11111111

計算機系統為什麼使用補碼?

先看例子:

  • 0:用正數表示
    • 原碼:00000000
    • 反碼:01111111
    • 補碼:00000000
  • 0:用負數表示
    • 原碼:10000000
    • 反碼:11111111
    • 補碼:00000000

所以0不管使用正數還是負數表示,它的補碼都是一樣的。

例子:

-6+5:

    11111010

+  00000101

=  11111111

-4+5:

    11111100

+  00000101

=  00000001

-3+5:

    11111101

+  00000101

=  00000010

可以發現補碼做數值相加是非常方便的,-3+5等同於5-3,所以減法也是如此。運算過程是相同的,不需要額外的硬體電路。需要注意的是計算機數值相加,符號位是需要參與運算的。