python 原碼,反碼,補碼
一、 機器數和真值
1.1 機器數
機器數:一個數在計算機中的二進制表示形式
-
機器數帶符號,在計算機用一個數的最高位存放符號,正數為0,負數為1
-
例如: 十進制中的數 +3 ,計算機字長為8位,轉換成二進制就是00000011。如果是 -3 ,就是 10000011
其中,00000011 和 10000011就是機器數
1.2 真值
真值:將帶符號位的機器數對應的真正數值稱為機器數的真值。
- 例如:0000 0001的真值 = +000 0001 = +1 1000 0001的真值 = –000 0001 = –1
二、原碼,反碼,補碼
在探求為何機器要使用補碼之前, 讓我們先了解原碼, 反碼和補碼的概念.
對於一個數, 計算機要使用一定的編碼方式進行存儲. 原碼, 反碼, 補碼是機器存儲一個具體數字的編碼方式.
2.1 原碼
原碼就是符號位加上真值的絕對值
即用第一位表示符號, 其余位表示值.
例如:如果是8位二進制,那么
[+1]原 = 0000 0001
[-1]原 = 1000 0001
第一位是符號位. 因為第一位是符號位, 所以8位二進制數的取值范圍就是:
[1111 1111 , 0111 1111]
即
[-127 , 127]
原碼在展示上是與機器數相同的
2.2 反碼
反碼的表示方法是:
-
正數的反碼是其本身
-
負數的反碼是在其原碼的基礎上, 符號位不變,其余各個位取反.
[+1] = [00000001]原 = [00000001]反
[-1] = [10000001]原 = [11111110]反
3. 補碼
補碼的表示方法是:
-
正數的補碼就是其本身
-
負數的補碼是在其原碼的基礎上, 符號位不變, 其余各位取反, 最后+1. (即在反碼的基礎上+1)
[+1] = [00000001]原 = [00000001]反 = [00000001]補
[-1] = [10000001]原 = [11111110]反 = [11111111]補
對於負數, 補碼表示方式也是人腦無法直觀看出其數值的. 通常也需要轉換成原碼在計算其數值.
三、為何要使用原碼, 反碼和補碼
待更新https://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html
四、 python實現
不管n是正數還是負數,只需要
bin(n & 0xFFFFFFFF)
就可得到n的補碼