整形有兩種類型:有符號和無符號。無符號整形(即此類型沒有負數(shù))以一種非常直接的二進制方式來表示。數(shù)字200作為一個無符號整形數(shù)將被表示為11001000(或十六進制C8)。
有符號整形(即此類型可能為正數(shù)也可能為負數(shù))以一種更復雜的方式來表示。例如,考慮?56。+56當作一個字節(jié)來考慮時將被表示為00111000。在紙上,你可以將?56表示為?111000,但是在電腦內(nèi)存中如何以一個字節(jié)來表示,如何儲存這個負號呢?
有三種普遍的技術被用來在電腦內(nèi)存中表示有符號整形。所有的方法都把整形的最大有效位當作一個符號位來使用。如果數(shù)為正數(shù),則這一位為0;為負數(shù),這一位就為1。
原碼
第一種方法是最簡單的,它被稱為原碼。它用兩部分來表示一個整形。第一部分是符號位,第二部分是整形的原碼。所以56表示成字節(jié)形式為00111000 (符號位加了下劃線)而?56將表示為10111000。
最大的一個字節(jié)的值將是01111111或+127,而最小的一個字節(jié)的值將是11111111或?127。要得到一個數(shù)的相反數(shù),只需要將符號位變反。這個方法很簡單直接,但是它有它的缺點。首先,0會有兩個可能的值:+0 (00000000) 和?0(10000000)。因為0不是正數(shù),也不是負數(shù),所以這些表示法都應該把它表示成一樣。這樣會把CPU的運算邏輯弄得很復雜。第二,普通的運算同樣是麻煩的。如果10加?56,這個將改變?yōu)?0減去56。同樣,這將會復雜化CPU的邏輯。
反碼
第二種方法稱為反碼表示法。一個數(shù)的反碼可以通過將這個數(shù)的每一位求反得到。(另外一個得到的方法是:新的位值等于1?老的位值。) 例如:00111000 (+56)的反碼是11000111。在反碼表示法中,計算一個數(shù)的反碼等價于求反。因此,?56就可以表示為11000111。注意,符號位在反碼中
是自動改變的,你需要兩次求反碼來得到原始的數(shù)值。就像第一種方法一樣,
0有兩種表示:
00000000 (+0)和11111111 (?0)。
用反碼表示的數(shù)值的運算同樣是麻煩的。這有一個小訣竅來得到一個十六進制數(shù)值的反碼,而不需要將它轉(zhuǎn)換成二進制。這個訣竅就是用F(或十進制中的15)減去每一個十六進制位。這個方法假定數(shù)中的每一位的數(shù)值是由4位二進制組成的。這有一個例子:+56 用十六進制表示為38。要得到反碼,用F減去每一位,得到C7。這個結果是與上面的結果吻合的。
補碼
前面描述的兩個方法用在早期的電腦中?,F(xiàn)代的電腦使用第三種方法稱為補碼表示法。一個數(shù)的補碼可以由下面兩步得到:
1. 找到該數(shù)的反碼
2. 將第一步的結果加1
這有一個使用00111000 (56)的例子。首先,經(jīng)計算得到反碼:11000111 。
然后加1:
在補碼表示法中,計算一個補碼等價于對一個數(shù)求反。因此,11001000是?56的補碼。要得到原始數(shù)值需兩次求反。令人驚訝的是補碼不符合這個規(guī)定。通過對11001000的反碼加1得到補碼。
當在兩個補碼操作數(shù)間進行加法操作時,最左邊的位相加可能會產(chǎn)生一個進位。這個進位是不被使用的。記住在電腦中的所有數(shù)據(jù)都是有固定大小的(根據(jù)位數(shù)多少)。兩個字節(jié)相加通常得到一個字節(jié)的結果(就像兩個字相加得到一個字,等。) 這個特性對于補碼表示法來說是非常重要的。例如,把0作為一個字節(jié)來考慮它的補碼形式(00000000)。計算它的補碼形式得到總數(shù):
其中c代表一個進位。(稍后將展示如何偵查到這個進位,但是它在這的結果中不儲存。)因此,在補碼表示法中0只有一種表示。這就使得補碼的運算比前面的方法簡單。
使用補碼表示法,一個有符號的字節(jié)可以用來代表從?128 到+127的數(shù)值。表2.1 展示一些可選的值。如果使用了16位,那么可以表示從?32; 768到+32; 767的有符號數(shù)值。+32; 767可以表示為7FFF,?32; 768 為8000, -128為FF80而-1為FFFF。32位的補碼大約可以表示?20億到+20億的數(shù)值范圍。
CPU對某一的字節(jié)(或字,雙字)具體表示多少并不是很清楚。匯編語言并沒有類型的概念,而高級語言有。數(shù)據(jù)解釋成什么取決于使用在這個數(shù)據(jù)上的指令。到底十六進制數(shù)FF被看成一個有符號數(shù)?1 還是無符號數(shù)+255取決于程序員。C語言定義了有符號和無符號整形。這就使C編譯器能決定使用正確的指令來使用數(shù)據(jù)。
更多建議: