關於原碼反碼及補碼

2021-08-15 01:29:07 字數 1442 閱讀 4000

首先,在有符號數中,正數的原始碼,反碼和補碼都是相同的,首位為符號位(正數為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 當...