變量定義類型長度的理解

1 字節 = 8位 
int型 2字節 = 16位

按VC++和C++的規定,int和long等長,都是32位的。short纔是16位的。只有原始的C才定義int和short等長爲16位。 

這個數據範圍指的確實是具體 int的取值範圍,但不是你理解的那樣。 
如今以16位的short爲例。 
首先必須清楚一個概念,計算機中存放的數據都是以二進制形式存放的。short存放的是整型數據,是用固定位數16個二進制位來表示一個整數,不足16位補0。 
好比125的二進制是1111101,那麼在內存中存放就是 
0000 0000 0111 1101 

那麼16個二進制位可以表示多少種不一樣的整數呢?稍微用點數學常識就知道,是2的16次方,也就是65536個不一樣的整數。因此對於無符號整數,unsigned short的範圍就是0~65535。 
而爲了表示負數,計算機用short的第一位做爲符號位來表示正負。注意,計算機中是以補碼的形式存放整數的。對於正數,補碼是其自己;對於負數,其補碼是對其絕對值的按位取反,再加1的結果。 
舉個簡單的例子: 
125是0000 0000 0111 1101 
-125計算過程: 
125是0000 0000 0111 1101 
按位取反,1111 1111 1000 0010 
再加1,1111 1111 1000 0011 
因此-125就是1111 1111 1000 0011。 
補碼不是三言兩語能講得清楚的,樓主有個概念便可。 
咱們發現,正數的補碼首位都是0,負數的補碼首位都是1。 
short有符號型的範圍是-32768~32767。 

那麼,若是超出了範圍,會發生什麼現象呢? 
很簡單,這稱爲溢出。 
好比short a = 32768 
32768是1000 0000 0000 0000。還記得我講過嗎?正數的補碼首位都是0,但這裏首位爲1,這是怎麼回事呢?其實由於浪費了1位作符號位,short的有效位數只是15位而已,而2的15次方是32768,所以正數的範圍是0~32767,32768超出了範圍,計算機怎麼處理呢?結果就是把它看成負數,根據補碼計算它的原碼。反過來便可 
1000 0000 0000 0000 減1, 
0111 1111 1111 1111 再按位取反, 
1000 0000 0000 0000 就是32768 
因此1000 0000 0000 0000表示-32768 
也就是說short a = 32768;把a輸出來獲得-32768樓主能夠試驗一下。 

再舉一例: 
unsigned short a=65536; 
65536是1 0000 0000 0000 0000 注意這已是17位了。計算機會自動截取後面的16位 
就是獲得0000 0000 0000 0000,也就是0 
因此unsigned short a=65536;輸出a獲得0。 
明白了嗎?
相關文章
相關標籤/搜索