原碼 true code
原碼很簡單,一個10進位正數通過除2法轉換成的2進位數就是原碼。
比如8的原碼是:1000
反碼 complement,bitwise NOT
也很簡單,就是翻轉每個bit。比如:
NOT 0111 (decimal 7) = 1000 (decimal 8)
C/C++語言中,用~運算子就可以得到反碼。
One's complement
這是一種對有符號整數的電腦內部二進位表示方法,in short,正數相同,負數用反碼。下面的例子來自wikipedia.
The table below shows all possible values in a 4-bit system, from −7 to +7.
+ - 0 0000 1111 Note that +0 and −0 return TRUE when tested for zero, FALSE when tested for non-zero. 1 0001 1110 2 0010 1101 3 0011 1100 4 0100 1011 5 0101 1010 6 0110 1001 7 0111 1000
該方法由於有些缺點,並不常用。
Two's complement
這是最常用的電腦表示有符號整數的方法。
遇到正數不變,遇到負數是將二進位求反加1,忽略溢出。
The table below shows all possible values in a 4-bit system, from −7 to +7.
+ - 0 0000 Note 0 has only one presentation:0000,no -0 1 0001 1111 2 0010 1110 3 0011 1101 4 0100 1100 5 0101 1011 6 0110 1010 7 0111 1001
這就是常說的補碼。
補碼
補碼的邏輯演算法是:(正數相同,符號位為0)
1.-7的數值部分(不包括符號) 表示成整數是111
2.加上符號1表示負數,因此是1111
3.只反轉非符號位,因此是1000
4.加上1,因此是1001
現在看看電腦如何使用two's complement表示-7的演算法。
1.7表示位00000111 (在電腦中數字至少佔一個位元組)
2.取反後,變成11111000
3.加1後,變成11111001 (高位不足電腦裡面用符號位補足)
兩者結果相同。