首先,在有符號數中,正數的原始碼,反碼和補碼都是相同的,首位為符號位(正數為0),後面的以二進位制數值表示其數值。
接下來看負數
在原始碼中,負數也類似於正數的表示,不過符號位變為了1
原始碼表示負數是最簡單的也是最容易理解的,符號位表示正負號,其餘位轉化為二進位制即可。但是原始碼存在許多缺陷,比如0的表示不唯一,10000000和00000000都可以表示為0,在程式中存在正0和負0則可能出現二義性。其次,由於許多算式在計算時會牽扯到符號位的計算,如兩個不同符號的數相加,需要判定兩個數的大小來確定計算後的符號。
反碼在程式設計中很少使用,而更多的是作為原碼到補碼的乙個中間過程,反碼的正數和原碼是一樣的,但是反碼的負數數值位是原碼的取反,例如原碼1011的反碼為1100.同樣,反碼的0的表示也不唯一。
補碼 書上給了乙個簡單的例子
關於手錶校準的問題,手錶顯示8點,而實際時間為6點,可以向前撥動10個小時,或者說是向後撥動2個小時;
轉化為數學式8-2=6
或者是8+10(2的補數)mod 12
即減去乙個數可以看作是加上這個數的補數然後取模運算
鐘錶可以看作是在12進製中10和2互為補數
那麼對於乙個4位的二進位制而言,1001。首位為符號位1,數值位001。補數即為1000-001=111
在此有一條求解補碼的規律
對於乙個負數而言,補碼等於其反碼加一
對於這個求解規律的理解是
原碼和反碼是乙個互補的編碼,例如11001的反碼為00110,兩者相加等於11111
而補碼為100000-11001=(11111+1)-11001=(11001+00110)+1-11001=00110+1=反碼加1
當然這是乙個不嚴謹的舉例,沒有考慮到符號位,主要是為了方便理解,
對於乙個正數而言,其補碼是等於其原碼的。
補碼存在乙個特殊情況:
乙個四位的二進位制補碼所能表示的最小值
1000
其原值存在乙個1111+1進製的情況,而補碼對於這個進製是採取捨棄的態度即0000,而這個明顯是表示乙個負值,所以補碼規定對於【x】補=1000其真值為-8(由此引出補碼的表示範圍最小值會比原碼和反碼多一,並且0的表示在補碼中唯一)
對於乙個小數而言
【x】原=1.1001(1表示為負數)
【x】反=1.0110
【x】補=1.0111(加上0.001)
其他tips
字串和字元的儲存方式不同
「a」
儲存方式為 a \0
而以字元儲存
『a』
儲存方式為 a
%取餘符號只能用於int型變數
&&和||存在短路現象
如果(x1)&&(x2)
如果x1為假,則不進入表示式x2
||同理
關於原碼,補碼和反碼
數值在計算機中表示形式為機器數,計算機只能識別0和1,使用的是二進位制,而在日常生活中人們使用的是十進位制.數值有正負之分,計算機就用乙個數的最高位存放符號 0為正,1為負 這就是機器數的原碼了.假設機器能處理的位數為8.即字長為1byte,原碼能表示數值的範圍為 127 0 0 127 共256個...
原碼 反碼 補碼
正數 原碼 反碼 補碼一樣 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 當...