整數型別

尹成發表於2014-09-05

    C++中提供的整數型別有三種:int、long、short,每種型別又分為有符號和無符號兩種型別。有符號整數既可以表示非負整數,又可以表示負整數;但是,無符號整數不能表示負數,只能表示非負整數。

(一)無符號整數

    在記憶體中,int整數通常佔4位元組,這裡,我們假定int為32位,那麼無符號整數表示的取值範圍為0x00000000~0xFFFFFFFF,轉換為十進位制為0~4294967295。當無符號整數表示的整數小於32位的時候,不足的空間,在最高位補0。比如數字5對應的二進位制位101,那麼剩餘的29位在最高位補0,填充後的結果為:00000000000000000000000000000101。在計算中,無符號整數表示的正整數範圍是有符號整數的2倍。

(二)有符號整數

    在有符號整數中,資料的最高位代表符號位,1為負號,0為正號,在計算中,有符號整數是以補碼的形式來存放的。以int整數為例,當資料的位數不足32位的時候,先將該數轉換為補碼,然後擴充套件該數的符號位至第31位。比如,5的補碼是0101,那麼只需要將最高位的0向左不斷擴充套件直至第31位,最終結果為:00000000000000000000000000000101;-5的補碼為1011,那麼

只需要將最高位的1向左擴充套件至第31位,最終結果為:11111111111111111111111111111011。

    在32位整數中,有符號整數表示的非負整數範圍為:0x00000000~0x7FFFFFFF;負數的表示區間為:0x80000000~0xFFFFFFFF。

    在我們討論的C/C++中,有符號整數都是以補碼形式存放的,而且在幾乎所有的程式語言中都是如此,因為計算機只會做加法,不會做減法,所以需要將減法轉換為加法。

    如設有符號數x,y,那麼x-y的值會被轉換為x(補)+(-y)(補);例如,(3-2)可轉換成(3+(-2)),運算過程為:3的十六進位制補碼0x00000003加上(-2)的補碼0xFFFFFFFE,從而得到0x100000001。由於儲存範圍為4位元組大小,兩數相加後產生了進位,超出了儲存範圍,超出的1將被捨棄。進位被捨棄後,結果為0x00000001。

   


    

相關文章