原碼
(1) 原碼:在數值前直接加一符號位的表示法。
例如: 符號位 數值位
[+7]原= 0 0000111 b
[-7]原= 1 0000111 b
注意:
a. 數0的原碼有兩種形式: [+0]原=00000000b [-0]原=10000000b
b. 8位二進位制原碼的表示範圍:-127~+127
反碼 (2)反碼:
正數:正數的反碼與原碼相同。
負數:負數的反碼,符號位為「1」,數值部分按位取反。
例如: 符號位 數值位
[+7]反= 0 0000111 b ([+7]原= 0 0000111 b)
[-7]反= 1 1111000 b ([-7]原= 1 0000111 b)
注意:
a. 數0的反碼也有兩種形式,即
[+0]反=00000000b
[- 0]反=11111111b
b. 8位二進位制反碼的表示範圍:-127~+127
補碼 (3)
計算機中數值就以補碼形式儲存,所以用補碼進行運算的。
補碼的表示方法
正數:正數的補碼和原碼相同。
負數:負數的補碼則是符號位為「1」,數值部分按位取反後再在末位(最低位)加1。也就是「反碼+1」。
例如: 符號位 數值位
[+7]補= 0 0000111 b ([+7]原= 0 0000111 b)
[-7]補= 1 1111001 b ([-7]原= 1 0000111 b)
補碼在微型機中是一種重要的編碼形式,請注意:
a. 採用補碼後,可以方便地將減法運算轉化成加法運算,運算過程得到簡化。正數的補碼即是它所表示的數的真值,而負數的補碼的數值部份卻不是它所表示的數的真值。採用補碼進行運算,所得結果仍為補碼。
b. 與原碼、反碼不同,數值0的補碼只有乙個,即 [0]補=00000000b。
c. 若字長為8位,則補碼所表示的範圍為-128~+127;進行補碼運算時,應注意所得結果不應超過補碼所能表示數的範圍。
記住:正數的原碼、反碼、補碼都是一樣的;
負數的反碼就是符號位不變(即為「1」),其餘位取反;
負數的補碼就是「反碼+1」。
2.原碼、反碼和補碼之間的轉換
由於正數的原碼、補碼、反碼表示方法均相同,不需轉換。
在此,僅以負數情況分析。
(1) 已知原碼,求補碼。
例:已知某數x的原碼為10110100b,試求x的補碼和反碼。
解:由[x]原=10110100b知,x為負數。求其反碼時,符號位不變,數值部分按位求反;求其補碼時,再在其反碼的末位加1。
1 0 1 1 0 1 0 0 原碼
1 1 0 0 1 0 1 1 反碼,符號位不變,數值位取反
1 1 0 0 1 1 0 0 補碼
故:[x]補=11001100b,[x]反=11001011b。
(2) 已知補碼,求原碼。
分析:按照求負數補碼的逆過程,數值部分應是最低位減1,然後取反。但是對二進位制數來說,先減1後取反和先取反後加1得到的結果是一樣的,故仍可採用取反加1的方法。
例:已知某數x的補碼11101110b,試求其原碼。
解:由[x]補=11101110b知,x為負數。求其原碼表示時,符號位不變,數值部分按位求反,再在末位加1。
1 1 1 0 1 1 1 0 補碼
1 0 0 1 0 0 0 1 符號位不變,數值位取反
1 0 0 1 0 0 1 0 原碼
例子:
#include
int main()
//-2
//假設int佔兩個位元組, 正數的原碼反碼補碼都相同均相同:i記憶體中存放形式為 0000 0001
//那麼 ~i = 1111 1110 這個數存放到j中,這裡是補碼的形式
//所以j的原碼是 1000 0010 即 -2 ,所以輸出-2
整數表示 補碼 原碼 反碼
一 補碼 最常見的有符號數的計算機表示方式就是補碼 two s complement 形式。在這個定義中,將字的最高位解釋為負權 negative weight 用函式 最高有效位也成為符號位,他的權重為 2 w 1 是無符號表示中權重的負數。符號位被置為1時,表示值為負,而當設定為0,值為負數。這...
原碼 反碼和補碼
數值有正負之分 計算機就用乙個數的最高位存放符號 0為正 1為負 這就是機器數的原碼了 假設機器能處理的位數為 8.即字長為 1byte,原碼能表示數值的範圍為 127 0 0 127 共256個.有了數值的表示方法就可以對數進行算術運算 但是很快就發現用帶符號位的原碼進行乘除運算時結果正確 而在加...
原碼 反碼 和 補碼。
這裡只講下自己對反碼的理解。大家都知道使用反碼表示負數有兩個優點,1.可以使得減法可以和加法一樣。2.符號位也參與了運算。那這是為什麼呢?下面可以進行一些簡單的數學推導 根據反碼定義,對於負數,反碼是除符號為以外取反 1。例如,4 變換步驟如下。a 4 0 000 0100 b 取反 0 111 1...