電腦中的原碼、反碼、補碼

來源:互聯網
上載者:User

     在電腦系統中,整數一律用補碼來表示(儲存)。

     在電腦中,整數用補碼來表示,可以將符號位和其他位統一處理,同時減法也可按加法來處理,另外,兩個用補碼錶示的數相加時,如果最高位(符號位)有進位,則進位被捨棄。於是電腦中只需要部署加法電路和補碼電路就可以完成所有整數的加法。

 

    無符號的整數就沒有原碼、反碼和補碼。只有有符號的整數才有原碼、反碼和補碼的!其他的類型一概沒有。

   雖然我們也可以用二進位中最小的數去對應最小的負數,最大的也相對應,但是那樣不科學,下面來說說科學的方法。還是說一個位元組的整數,不過這次是有符號的啦,1個位元組它不管怎麼樣還是只能表示256個數,因為有符號所以我們就把它表示成範圍:-128-127。它在電腦中是怎麼儲存的呢?可以這樣理解,用最高位表示符號位,如果是0表示正數,如果是1表示負數,剩下的7位用來儲存數的絕對值的話,能表示27個數的絕對值,再考慮正負兩種情況,27*2還是256個數。首先定義0在電腦中儲存為00000000,對於正數我們依然可以像無符號數那樣換算,從00000001到01111111依次表示1到127。那麼這些數對應的二進位碼就是這些數的原碼。到這裡很多人就會想,那負數是不是從10000001到11111111依次表示-1到-127,那你發現沒有,如果這樣的話那麼一共就只有255個數了,因為10000000的情況沒有考慮在內。實際上,10000000在電腦中表示最小的負整數,就是這裡的-128,而且實際上並不是從10000001到11111111依次表示-1到-127,而是剛好相反的,從10000001到11111111依次表示-127到-1。負整數在電腦中是以補碼形式儲存的,補碼是怎麼樣表示的呢,這裡還要引入另一個概念——反碼,所謂反碼就是把負數的原碼(負數的原碼和和它的絕對值所對應的原碼相同,簡單的說就是絕對值相同的數原碼相同)各個位按位取反,是1就換成0,是0就換成1,如-1的原碼是00000001,和1的原碼相同,那麼-1的反碼就是11111110,而補碼就是在反碼的基礎上加1,即-1的補碼是11111110+1=11111111,因此我們可以算出-1在電腦中是按11111111儲存的。總結一下,電腦儲存有符號的整數時,是用該整數的補碼進行儲存的,0的原碼、補碼都是0,正數的原碼、補碼可以特殊理解為相同,負數的補碼是它的反碼加1。

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

十進位 → 二進位  (怎麼算?要是不知道看電腦基礎的書去)
47   → 101111

有符號的整數    原碼    反碼    補碼
  47      00101111  11010000  00101111(正數補碼和原碼相同)
 -47      00101111  11010000  11010001(負數補碼是在反碼上加1)

再舉個例子,學C語言的同學應該做過這道題:
把-1以無符號的類型輸出,得什麼結果?(程式如下)

#include<iostream.h>
void main()
{
 short int n=-1;
 cout<<(unsigned short int)n<<endl;
}

  首先在我的電腦中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(short int)<<endl;看看你的電腦裡的短整型佔多少的儲存空間,也可以用sizeof來看其它任何類型所分配的儲存空間。

關於資料如何在電腦中儲存的,這裡只適用於整型的資料,對於浮點型的是另一種方式,這裡我們暫時就不深究了。

聯繫我們

該頁面正文內容均來源於網絡整理,並不代表阿里雲官方的觀點,該頁面所提到的產品和服務也與阿里云無關,如果該頁面內容對您造成了困擾,歡迎寫郵件給我們,收到郵件我們將在5個工作日內處理。

如果您發現本社區中有涉嫌抄襲的內容,歡迎發送郵件至: info-contact@alibabacloud.com 進行舉報並提供相關證據,工作人員會在 5 個工作天內聯絡您,一經查實,本站將立刻刪除涉嫌侵權內容。

A Free Trial That Lets You Build Big!

Start building with 50+ products and up to 12 months usage for Elastic Compute Service

  • Sales Support

    1 on 1 presale consultation

  • After-Sales Support

    24/7 Technical Support 6 Free Tickets per Quarter Faster Response

  • Alibaba Cloud offers highly flexible support services tailored to meet your exact needs.