計算機中的原碼 反碼和補碼

2021-08-30 23:12:02 字數 3486 閱讀 2541

大家都知道資料在計算機中都是按位元組來儲存了,1個位元組等於8位(1byte=8bit),而計算機只能識別0和1這兩個數,所以根據排列,1個位元組能代表256種不同的資訊,即2

8(0和1兩種可能,8位排列),比如定義乙個位元組大小的無符號整數(unsigned char),那麼它能表示的是0~255(0~2

8-1)這些數,一共是256個數,因為,前面說了,乙個位元組只能表示256種不同的資訊。別停下,還是乙個位元組的無符號整數,我們來進一步剖析它,0是這些數中最小的乙個,我們先假設它在計算機內部就用8位二進位制表示為00000000(從理論上來說也可以表示成其他不同的二進位製碼,只要這256個數每個數對應的二進位製碼都不相同就可以了),再假設1表示為00000001,2表示為00000010,3表示為00000011,依次類推,那麼最大的那個數255在8位二進位制中就表示為最大的數11111111,然後,我們把這些二進位製碼換算成十進位制看看,會發現剛好和我們假設的數是相同的,而事實上,在計算機中,無符號的整數就是按這個原理來儲存的,所以告訴你乙個無符號的整數的二進位製碼,你就可以知道這個數是多少,而且知道在計算機中,這個數本身就是以這個二進位製碼來儲存的。比如我給你乙個2個位元組大小的二進位製碼,首先宣告它表示的是無符號的整數:00000000 00000010,我們把前面的0省略,換算一下,它表示的也是數值2,和前面不同的是,它佔了2個位元組的記憶體。不同的型別佔的記憶體空間不同,如在我的電腦中char是1個位元組,int是4個位元組,long是8個位元組(你的可能不同,這取決於不同的計算機設定),它們的不同之處僅僅是記憶體大的能表示的不同的資訊多些,也就是能表示的數範圍更大些(unsigned int能表示的範圍是0~2

8*4-1),至於怎麼算,其實都是一樣的,直接把二進位制與十進位制相互轉換,二進位制就是它在計算機中的樣子,十進位制就是我們所表示的數。啊哈,原來這些都是可以計算的呀,我曾經還以為不同的計算機儲存的原理是不同的,取決於商家的喜好呢,呵呵。

呵呵,對,只有有符號的整數才有原碼、反碼和補碼的!其他的型別一概沒有。雖然我們也可以用二進位制中最小的數去對應最小的負數,最大的也相對應,但是那樣不科學,下面來說說科學的方法。還是說乙個位元組的整數,不過這次是有符號的啦,1個位元組它不管怎麼樣還是只能表示256個數,因為有符號所以我們就把它表示成範圍:-128-127。它在計算機中是怎麼儲存的呢?可以這樣理解,用最高位表示符號位,如果是0表示正數,如果是1表示負數,剩下的7位用來儲存數的絕對值的話,能表示2

7個數的絕對值,再考慮正負兩種情況,2

7*2還是256個數。首先定義0在計算機中儲存為00000000,對於正數我們依然可以像無符號數那樣換算,從00000001到01111111依次表示1到127。那麼這些數對應的二進位製碼就是這些數的原碼。到這裡很多人就會想,那負數是不是從10000001到11111111依次表示-1到-127,那你發現沒有,如果這樣的話那麼一共就只有255個數了,因為10000000的情況沒有考慮在內。實際上,10000000在計算機中表示最小的負整數,就是這裡的-128,而且實際上並不是從10000001到11111111依次表示-1到-127,而是剛好相反的,從10000001到11111111依次表示-127到-1。負整數在計算機中是以補碼形式儲存的。

正數原碼的符號位為0,負數符號位為1,有效位部分用二進位制的絕對值表示。也就是說正負數的原碼的區別就只在符號位。

正數的反碼和原碼相同, 負數的反碼為負數原碼符號位不變, 其他各位按位取反。

正數的補碼和原碼相同,負數的補碼為反碼末位加1.也就是負數補碼是負數原碼符號位不變,其他各位取反,末位加1.

如8位表示的-1的原碼是10000001,那麼-1的反碼就是11111110,而補碼就是在反碼的基礎上加1,即-1的補碼是11111110+1=11111111,因此我們可以算出-1在計算機中是按11111111儲存的。

總結一下,計算機儲存有符號的整數時,是用該整數的補碼進行儲存的,0的原碼、補碼都是0,正數的原碼、補碼可以特殊理解為相同,負數的補碼是它的反碼加1。

下面再多舉幾個例子,來幫助大家理解!

十進位制 → 二進位制  

47   → 101111

有符號的整數    原碼    反碼    補碼

47      00101111  00101111  00101111(正數補碼和原碼相同)

-47      10101111  11010000  11010001(負數補碼是在反碼上加1)

再舉個例子,學c語言的同學應該做過這道題:

把-1以無符號的型別輸出,得什麼結果?(程式如下)

#include

void main()

{short int n=-1;

cout<<(unsigned short int)n<

首先在我的電腦中short int型別的儲存空間是2個位元組,你的可能不同,我說過,這取決於你的計算機配置。它能儲存28*2=65536個不同的資料資訊,如果是無符號那麼它的範圍是0~65535(0~216-1),如果是有符號,那麼它的範圍是-32768~32767(-215~215-1)。這道題目中,開始n是乙個有符號的短整型變數,我們給它賦值為-1,根據我們前面所說的,它在計算機中是以補碼11111111 11111111儲存的,注意前面說了是2個位元組。如果把它強制為無符號的短整型輸出的話,那麼我們就把剛才的二進位制把看成無符號的整型在計算機中儲存的形式,對待無符號的整型就沒有什麼原碼、反碼和補碼的概念了,直接把11111111 11111111轉化成十進位制就是65535,其實我們一看都是一就知道它是範圍中最大的乙個數了。呵呵,就這麼簡單。你個把上面的源**編譯執行看看,如果你的電腦short int也是兩個位元組,那就會和我得一樣的結果。你可以先用這個語句看看:cout《看看你的電腦裡的短整型佔多少的儲存空間,也可以用sizeof來看其它任何型別所分配的儲存空間。

最後提醒一句,關於資料如何在計算機中儲存的,這裡只適用於整型的資料,對於浮點型的是另一種方式.

下面是我實驗用的資料(我用的是32位系統)

int inta = -1;

int intb = -127;

int intc = -128;

int intd = 0;

int intf = 1;

int inte = 127;

反彙編**如下:

int inta = -1;

0041152e  mov         dword ptr [ebp-8],  0ffffffffh  (1111 1111)

int intb = -127;

00411535  mov         dword ptr [ebp-14h],0ffffff81h  (1000 0001)

int intc = -128;

0041153c  mov         dword ptr [ebp-20h],0ffffff80h  (1000 0000)

int intd = 0;

00411543  mov         dword ptr [ebp-2ch],0

int intf = 1;

0041154a  mov         dword ptr [ebp-38h],1

int inte = 127;

00411551  mov         dword ptr [ebp-44h],7fh

計算機中的原碼 反碼和補碼

計算機中的原碼 反碼和補碼 看到這個標題,很多人有話要說了,切!這個東西每一本計算機基礎知識的書中都有介紹的,你還拿出來show什麼嘛!我的原則是你需要就來看一看,懂就不要去理會,倒也不必諷刺兩句,我相信總有需要它的人。當初我看書是沒看明白的,在網上查了好多資料才有所悟。前幾天跟老婆講原碼 反碼和補...

計算機中的原碼 補碼和反碼

數在計算機中是以二進位制形式表示的。數分為有符號數和無符號數。原碼 反碼 補碼都是有符號定點數的表示方法。乙個有符號定點數的最高位為符號位,0是正,1是副。以下都以8位整數為例,原碼就是這個數本身的二進位制形式。例如0000001 就是 1 1000001 就是 1 正數的反碼和補碼都是和原碼相同。...

計算機中的原碼 反碼和補碼

原碼和反碼都很簡單,原碼是數字的二進位制表示,反碼是數字二進位制表示後每一位都取反。重點說補碼 為什麼要用補碼?假設當前時針指向8點,而準確時間是6點,調整時間可有以下兩種撥法 一種是倒撥2小時,即8 2 6 另一種是順撥10小時,8 10 12 6 6,即8 2 8 10 8 12 2 mod 1...