原碼 補碼 反碼及計算機中負數的表示

2021-07-31 20:14:08 字數 1708 閱讀 9985

第一位為符號位,後面的為數字的二進位制表示。

eg: 127 和 -127 的 8位原碼為 [0111 1111, 1111 1111]

正數的反碼為其原碼;負數的反碼,符號位不変,後面的取反。

eg: 1的8位原碼和反碼為 [00000001]原 = [00000001]反

-1的8位反碼為 [10000001]原 = [11111110]反

正數的反碼為其原碼;負數的補碼為其補碼+1

[+1] = [00000001]原 = [00000001]反 = [00000001]補

[-1] = [10000001]原 = [11111110]反 = [11111111]補

將符號位也參與運算的方法. 我們知道, 根據運算法則減去乙個正數等於加上乙個負數, 即: 1-1 = 1 + (-1) = 0 , 所以機器可以只有加法而沒有減法, 這樣計算機運算的設計就更簡單了.

然而,如果使用原碼運算:

計算十進位制的表示式: 1-1=0

1 - 1 = 1 + (-1) = [00000001]原 + [10000001]原 = [10000010]原 = -2

結果不正確,如果用反碼的話:

1-1=0

1 - 1 = 1 + (-1)

= [0000 0001]原 + [1000 0001]原

= [0000 0001]反 + [1111 1110]反

= [1111 1111]反

= [1000 0000]原

= -0

結果的真值部分是正確的. 而唯一的問題其實就出現在」0」這個特殊的數值上. 雖然人們理解上+0和-0是一樣的, 但是0帶符號是沒有任何意義的. 而且會有[0000 0000]原和[1000 0000]原兩個編碼表示0.於是補碼的出現, 解決了0的符號以及兩個編碼的問題:

1-1 = 1 + (-1)

= [0000 0001]原 + [1000 0001]原

= [0000 0001]補 + [1111 1111]補

= [0000 0000]補

=[0000 0000]原

這樣0用[0000 0000]表示, 而以前出現問題的-0則不存在了.而且可以用[1000 0000]表示-128:

(-1) + (-127)

= [1000 0001]原 + [1111 1111]原

= [1111 1111]補 + [1000 0001]補

= [1000 0000]補

這就是為什麼c++ 中 int_max 是2147483647 , 而int_min是 -2147483648

#define int_max 2147483647  

#define int_min (-int_max - 1)

這裡沒有簡單地將int_min賦值成 -2147483648,是因為-2147483648對於編譯器而言是個表示式,而2147483648對於32-bit整數是無法表示的,在計算機中以原碼的形式表示為 10000…0000(31個0)。

原碼 反碼 補碼,計算機中負數的表示

原碼 將乙個整數,轉換成二進位制,就是其原碼。如單位元組的5的原碼為 0000 0101 5的原碼為1000 0101。反碼 正數的反碼就是其原碼 負數的反碼是將原碼中,除符號位以外,每一位取反。如單位元組的5的反碼為 0000 0101 5的反碼為1111 1010。補碼 正數的補碼就是其原碼 負...

原碼 反碼 補碼,計算機中負數的表示

原碼 將乙個整數,轉換成二進位制,就是其原碼。如單位元組的5的原碼為 0000 0101 5的原碼為1000 0101。反碼 正數的反碼就是其原碼 負數的反碼是將原碼中,除符號位以外,每一位取反 如單位元組的5的反碼為 0000 0101 5的反碼為1111 1010。補碼 正數的補碼就是其原碼 負...

計算機中原碼 反碼 補碼

首先要明白,在計算機中,數以二進位制的形式存在,其中有無符號數和有符號數 無符號數的,相當於十進位制中的自然數,沒有負數,因此八位無符號數的範圍 00000000 11111111,而有符號數的最高位表示符號,最高位為0表示整數 0000 0001 1 最高位為1表示負數 1000 0001 1 原...