1 計算機中數值都是按補碼來存儲的。
原碼(原碼是帶符號位的):第一位表示符號位,0表示正數,1表示負數。符號位加上真值的絕對值
比如
0 0 0 0 0 0 0 1 表示正1
1 0 0 0 0 0 0 1 表示負1
反碼:正數的反碼就是原碼, 負數的反碼是在其原碼的基礎上, 符號位不變,其余各個位取反(符號位不取反,數值位取反)
0 0 0 0 0 0 0 1 表示正1
1 1 1 1 1 1 1 0 表示負1
這時候就產生了一個問題,正零和負零用反碼表示不一致,這樣不合理
0 0 0 0 0 0 0 0 表示正0
1 1 1 1 1 1 1 1 表示負0
補碼:正數的補碼就是原碼,負數的補碼是在其原碼的基礎上, 符號位不變, 其余各位取反, 最后+1(反碼+1)
0 0 0 0 0 0 0 0 表示正0
0 0 0 0 0 0 0 0 表示負0
這樣 0 0 0 0 0 0 0 0 表示零了,正零和負零統一了
補碼的好處:
統一了0的表示
符號位也可以當作數值一樣參與運算
八位字節,算上符號能夠表示的范圍是2^8=256個數。
-128 ~ 127 正好是256個數
補碼 1 0 0 0 0 0 0 0 1 求原碼 ,表示的數是 - 127
補碼 1 0 0 0 0 0 0 0 0 求原碼得出來的是0 0 0 0 0 0 0 0 ,這個是0的原碼 。這時,人為規定補碼 1 0 0 0 0 0 0 0 0 表示的值是-128
所以 0 0 0 0 0 0 0 0 表示零
1 0 0 0 0 0 0 0 表示-128
---------------------------------------------------------------------
原碼和補碼的相互轉換
正數的補碼與原碼相同
9的補碼是 0000 1001
負數的補碼 ,先得到他的原碼,再得到反碼+1
-15 1000 1111 ===》 1111 0000 ===》 1111 0001
數0的補碼表示是唯一的 0000 0000
已知補碼求原碼:
如果符號位是0 ,表示是一個正數,其原碼就是補碼
如果符號位是1 ,表示是一個負數,其原碼是 符號位不變,其余位取反后加1
補碼(1111 1001) 1000 0110 ==》 (原碼)1000 0111