數值在計算機中是以補碼的方式儲存的。
乙個數在計算機中的二進位制表示形式, 叫做這個數的機器數。機器數是帶符號的,在計算機用乙個數的最高位存放符號, 正數為0, 負數為1。比如,十進位制中的數 +2 ,計算機字長為8位,轉換成二進位制就是[00000010]。如果是 -2 ,就是 [10000010] 。因為第一位是符號位,所以機器數的形式值就不等於真正的數值。例如上面的有符號數[10000010],其最高位1代表負,其真正數值是 -2 而不是形式值130。所以將帶符號位的機器數對應的真正數值稱為機器數的真值。
原碼:在數值前直接加一符號位的表示法。eg:符號位 數值位
無符號位:0~255 有符號位:-127~ +127
byte(位元組,一位元組=8位元位)的取值範圍是-27+1~ 27-1 總計255個數
反碼:正數的反碼是其本身;
負數的反碼是在其原碼的基礎上, 符號位不變,其餘各個位取反。符號位為「1」,數值部分按位取反。
8位二進位制反碼的表示範圍:-127~+127。
eg: [+7]反= 0 0000111 b [-7]反= 1 1111000 b
注意:1000 0000 b 不等於0 而是 -128,+127 +1 = -128即 0111 1111 b+1 = 1000 0000 b ,也就是發生了 byte值溢位。
1000 0000 (原) = 1111 1111(反)
那麼問題來了: 64+32+16+8+4+2+1 = 127 為什麼會有128呢?
原來 負數的反碼是需要補碼來計算的,也就是在最後得出的結果上 +1
注意:計算機中只有 +0 而不存在 -0的說法,因為-0是完全沒有意義的存在,即:只有 0000 0000 = +0,而沒有 1000 0000 = -0
1000 0000的真實身份是 -128
補碼:正數:正數的補碼和原碼相同。
負數:負數的補碼則是符號位為「1」。並且,這個「1」既是符號位,也是數值位。數值部分按位取反後再在末位(最低位)加1。也就是「反碼+1」。
[+7]補= 0 000 0111 b
[-7]補 = 1 111 1001 b
一:根據運算法則減去乙個正數等於加上乙個負數, 即: 1-1 = 1+(-1), 所以計算機被設計成只有加法而沒有減法, 而讓計算機辨別」符號位」會讓計算機的基礎電路設計變得十分複雜,於是就讓符號位也參與運算,從而產生了反碼。
用反碼計算, 出現了」0」這個特殊的數值, 0帶符號是沒有任何意義的。 而且會有[0000 0000]和[1000 0000]兩個編碼表示0。
於是設計了補碼, 負數的補碼就是反碼+1,正數的補碼就是正數本身,從而解決了0的符號以及兩個編碼的問題: 用[0000 0000]表示0,用[1000 0000]表示-128。
注意-128實際上是使用以前的-0的補碼來表示的, 所以-128並沒有原碼和反碼。使用補碼, 不僅僅修復了0的符號以及存在兩個編碼的問題, 而且還能夠多表示乙個最低數。 這就是為什麼8位二進位制, 使用補碼表示的範圍為[-128, 127]。
二:看有符號的。
若是用原碼表示,0表示為0000 000。因為咱們有符號,所以應該也有個負0(雖然它還是0):1000 0000。
那麼原碼能夠滿足我們的要求,把單位元組表示256個資料麼?
正數,沒問題,127是0111 1111,1是0000 0001,當然其它的應該也沒有問題。
負數呢,-1是1000 0001,那麼把負號去掉,最大的數是111 1111,也就是127,所以負數中最小能表示的資料是-127。
這樣似乎不太對勁,該如何去表示-128?貌似直接用原碼無法表示,而我們卻有兩個0。
如果我們把其中的乙個0指定為-128,不行麼?這也是乙個想法,不過有兩個問題:一是它與-127的跨度過大;二是在用硬體進行運算時不方便。
所以,計算機中,負數是採用補碼表示。
eg: 單位元組-1,原碼為1000 0001,反碼為1111 1110,補碼為1111 1111,計算機中的單位元組-1就表示為1111 1111。
單位元組-127,原碼是1111 1111,反碼1000 0000,補碼是1000 0001,計算機中單位元組-127表示為1000 0001。
單位元組-128,原碼貌似表示不出來,除了符號位,最大的數只能是127了,其在計算機中的表示為1000 0000。
計組 原碼反碼補碼的作用
原碼 用尾數表示真值的絕對值 反碼 若符號位為0,反碼和原碼一樣 若符號位為1,則數值位全部取反 補碼 正數的補碼 原碼 負數的補碼 反碼末位 1 要考慮進製 移碼 補碼的基礎上,符號位取反 只能表示整數 用加法運算來代替減法運算 例如 14 14 這個運算,如果在8bit的基礎上,可以看成計算機天...
原碼 反碼 補碼
正數 原碼 反碼 補碼一樣 7 原 0 0000111 b 7 反 0 0000111 b 7 補 0 0000111 b 負數 原碼就是原來的表示方法 反碼是除符號位 最高位 外取反 補碼 反碼 1 7 原 1 0000111 b 7 反 1 1111000 b 7 補 1 1111001 b 當...
原碼 反碼 補碼
正數 原碼 反碼 補碼一樣 7 原 0 0000111 b 7 反 0 0000111 b 7 補 0 0000111 b 負數 原碼就是原來的表示方法 反碼是除符號位 最高位 外取反 補碼 反碼 1 7 原 1 0000111 b 7 反 1 1111000 b 7 補 1 1111001 b 當...