實驗樓學習筆記--原碼、反碼和補碼

數據在計算機中都是按字節來儲存了,1個字節等於8位(1Byte=8bit),而計算機只能識別0和1這兩個數,所以根據排列,1個字節能代表256種不同的信息,即28(0和1兩種可能,8位排列),比如定義一個字節大小的無符號整數(unsigned char),那麼它能表示的是0~255(0~28-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~28*4-1),至於怎麼算,其實都是一樣的,直接把二進制與十進制相互轉換,二進制就是它在計算機中的樣子,十進制就是我們所表示的數(誤解:不同的計算機儲存的原理是不同的,取決於商家的
喜好呢)。無符號的整數根本就沒有原碼、反碼和補碼。
  只有有符號的整數纔有原碼、反碼和補碼的!其他的類型一概沒有。雖然我們也可以用二進制中最小的數去對應最小的負數,最大的也相對應,但是那樣不科學,下面來說說科學的方法。還是說一個字節的整數,不過這次是有符號的啦,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,符號位不參與運算)


爲什麼使用補碼形式:
其實計算機中的數值用補碼來表示,一是爲了防止0有2個編碼,其次就是爲了把減法運算用加法運算表示出來,以達到簡化電路的作用。具體內容請參看一些《邏輯設計》方面的問題。
  爲什麼用補碼錶示有符號整數。比如8位整數表示的範圍是-128~127,而不是-127~128呢?想過沒有,爲什麼二進制10000000在原碼和反碼中表示0,在補碼中它不表示0,保證了0表示的唯一性,但是它爲什麼表示負數,而不是整數,你也許會說,因爲它符號位是1呀,表示負數呀,對,繼續,+128我們用補碼怎麼表示,包括符號位,表示爲010000000,超過了2個字節,如果截取低8位,那麼是10000000,最高位(符號位)是1,表示的是一個負數,我們再看看-128的機器碼是多少,原碼110000000,反碼101111111,補碼110000000,截取低8位即10000000,表示的是一個負數。 
其實呀,這些總結出來的東西都是玩巧,也並不是說非要這樣實現,學了計算機邏輯原理,就知道,其實這樣做是由於物理條件關係。因爲運算器裏這樣做更容易實現計算。  

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章