對於一個數, 計算機要使用必定的編碼方式進行存儲. 原碼, 反碼, 補碼是機器存儲一個具體數字的編碼方式.html
原碼就是 符號位 加上 真值的絕對值, 即用最高位表示符號, 其他位表示值. 好比若是是8位二進制:編碼
[+1]原 = 0000 0001 [-1]原 = 1000 0001
由於最高位是符號位, 因此8位二進制數的取值範圍就是:spa
[1111 1111 ~ 0111 1111]
即code
[-127 ~ 127]
原碼是人腦最容易理解和計算的表示方式.htm
正數的反碼是其自己blog
負數的反碼是在其原碼的基礎上, 符號位不變,其他各個位取反.get
[+1] = [00000001]原 = [00000001]反 [-1] = [10000001]原 = [11111110]反
可見若是一個反碼錶示的是負數, 人腦沒法直觀的看出來它的數值. 一般要將其轉換成原碼再計算.基礎
正數的補碼就是其自己二進制
負數的補碼是在其原碼的基礎上, 符號位不變, 其他各位取反, 最後+1. (即在反碼的基礎上+1)方法
[+1] = [00000001]原 = [00000001]反 = [00000001]補 [-1] = [10000001]原 = [11111110]反 = [11111111]補
對於負數, 補碼錶示方式也是人腦沒法直觀看出其數值的. 一般也須要轉換成原碼在計算其數值.
補充:負數的補碼這麼記憶:符號位不變,其餘的從低位開始,直到遇到第一個1以前,什麼都不變,遇到第一個1後保留這個1,之後按位取反。
好比:-7[原] = 10000111
-7[補] = 11111001
有符號整數,二進制的最高位表示正負,不表示數值,最高位爲0時表示正數,爲1時表示負數,
這樣一來,能表示數值的就剩下(n-1)位了,
好比 char a= -1; 那麼二進制表示就爲 1000 0001,
1 表示爲 00000001 ,因此除去符號位剩下的7位
0 1111111 = 127 ,1 1111111= -127,範圍應該爲 -127~127 ,
可是問題出來了,教科書上是-128~127 啊,下面就剖析一下這個驚人的奇葩。。。
無符號的整數 用 所有二進制位 來存儲。
有符號的整數,最高位是 符號位 ,其他爲表示數值。
卻帶來一個麻煩,當進行加法時, 1 + 1
0000 0001
+ 0000 0001
———————————
0000 0010 = 2
當 1 - 1 ( 計算機只會作加法,因此會轉換爲 : 1 +(-1))
0000 0001
+ 1000 0001
———————————
1000 0010 = -2 1-1 = -2 ? 明顯不對❌
說明:用原碼 作 運算是不行的。
解決上面的問題:發明了反碼,下面用 反碼進行加法計算 1 + (-1)
1 是正數,反碼就是自己。
-1 是負數,反碼在其原碼基礎上,符號位不變,其他位取反
0000 0001
+ 1111 1110
——————————————————
1111 1111 由於是反碼計算,須要轉換爲原碼: 1000 0000 = -0
說明:反碼解決了相減的問題,卻又帶來一個問題 -0。 -0 == +0 == 0, 一個0 就夠了吧。
爲了不這個問題,又發明了補碼,下面用補碼進行加法計算 1 + (-1)
1 是正數,補碼就是自己。
-1 是負數,補碼在其原碼基礎上,符號位不變,其他位取反,最後 +1
0000 0001
+ 1111 1111
——————————————————
10000 0000 這裏變成了9位,char 爲 8位 最高位捨棄,結果爲0. ok
https://www.cnblogs.com/zhangziqiu/archive/2011/03/30/ComputerCode.html