在32位及以上操作系統上,int型數據的十進制表示范圍是:-231 到 231-1。
原因:因為int是帶符號類型,所以最高位為符號位,於是最大表示的正數的原碼(正數的原碼和補碼相同):01111111 11111111 11111111 11111111,也就是2的31次方減1。
再來看最小值,-2的31次方的原碼表示為10000000 00000000 00000000 00000000,此時最高位的數字既代表符號(1代表是負數,0代表是正數),也代表數值。求它的補碼(除符號位外按位取反,最后一位+1),所得結果為10000000 00000000 00000000 00000000。同樣也是最高位既代表符號又代表數值,也就是說-2的31次方的原碼和補碼是相同的。
接着試試-2的31次方減1,它的原碼為(假設先不考慮溢出)11111111 11111111 11111111 11111111,求反加1之后為10000000 00000000 00000000 00000001,變成了-1。所以,int的表示范圍是: -231 ~ 231-1。
補充運算符(轉)
int i = 1; i = i << 2;
這是把i左移兩位,左移的規則只記住一點:丟棄符號位,0補最低位!
如果移動的位數超過了該類型的最大位數,那么編譯器會對移動的位數取模。如對int型移動33位,實際上只移動了33%32=1位。
右移有兩種,算術右移(帶符號)>>和邏輯右移(不帶符號)>>>。
算術右移:符號位不變,左邊補上符號位。如: 1000 1000 >> 3 為 1111 0001
邏輯右移:符號位一起移動,左邊補上0。如:1000 1000 >>> 3 為 0001 0001
最后,移位的位數不能超過數據的大小,不能小於0。
轉自http://blog.csdn.net/jiangyi711/article/details/5217431