喜好呢)。無符號的整數根本就沒有原碼、反碼和補碼。
只有有符號的整數纔有原碼、反碼和補碼的!其他的類型一概沒有。雖然我們也可以用二進制中最小的數去對應最小的負數,最大的也相對應,但是那樣不科學,下面來說說科學的方法。還是說一個字節的整數,不過這次是有符號的啦,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 00101111 00101111(正數補碼和原碼、反碼相同,不能從字面理解)
-47 10101111 11010000 11010001(負數補碼是在反碼上加1,符號位不參與運算)
爲什麼用補碼錶示有符號整數。比如8位整數表示的範圍是-128~127,而不是-127~128呢?想過沒有,爲什麼二進制10000000在原碼和反碼中表示0,在補碼中它不表示0,保證了0表示的唯一性,但是它爲什麼表示負數,而不是整數,你也許會說,因爲它符號位是1呀,表示負數呀,對,繼續,+128我們用補碼怎麼表示,包括符號位,表示爲010000000,超過了2個字節,如果截取低8位,那麼是10000000,最高位(符號位)是1,表示的是一個負數,我們再看看-128的機器碼是多少,原碼110000000,反碼101111111,補碼110000000,截取低8位即10000000,表示的是一個負數。
其實呀,這些總結出來的東西都是玩巧,也並不是說非要這樣實現,學了計算機邏輯原理,就知道,其實這樣做是由於物理條件關係。因爲運算器裏這樣做更容易實現計算。