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。 明白了嗎?