1. 程式人生 > >java 中 int 型別的取值範圍

java 中 int 型別的取值範圍

int 是整型,對應我們數學上認識的數值為整數,就是沒有小數點的數。 在計算機系統中,我們為這種型別的數定了一個範圍(其實我們為每一種型別都定了範圍,至於這個範圍是多少.....(當然不能那麼快說)。 為什麼要有這個範圍的限制呢,這是為了物盡所用,不能浪費。打個比方,我要開一塊地(在儲存空間中開闢一塊空間),為了種菜(為了儲存一個數), 空間開好後,我往這塊地上種了一棵菜(放入數值1),如果這塊地只有一平米,那還好,如果這塊地要是一頃,那你就是敗家仔了。 計算機裡開闢空間總得給它指定一個值嘛,總不能讓它隨機開闢吧;如果從頭到尾只指定一個值,那就一棒子打死人,鬼知道什麼時候會不夠用或是有浪費啊, 所以要為你要存的東西指定一個範圍,好讓計算機知道要開多大的空間。所以才有這整型這種分型別的東西。 Byte(位元組)這一般都可以認為是我們比較常見常用的計量儲存空間大小的單位了(當然,凡事凡物都可以再往下細分,不用糾結這個),一個B(位元組)=8bit(位,對就是那個位,我們常說的多少位系統這個位), 也就是說一個位元組擁有8個格子(通俗地說哈,不要笑),我們都知道計算機底層是用0和1這兩個神奇的東西表示一切的,就像人類世界中的分子原子一樣,通過不同的數量,不同的排列組合,從而構造了無盡的計算機世界。 剛才說了一個位元組擁有8個格子,所以它最多能放8個1:11111111;最多能放8個0:00000000;中間嘛就是0與1 的排列組合我就不說了,以上只是在計算機底層的東西,反正就是這麼個情況。 但是,我們人類既然耗了盡大力氣來做這麼個東西,不可能讓它沒有意義,但是它要表示什麼意義呢,當然還是我們說了算。 歷史車輪滾滾,到現在,它表示啥並不是你說了算了,定好了。首先,在無符號的情況下(就是不考慮正負,沒有正負,預設正):11111111 這個就是2^8-1=255 ;00000000 就是0,也就是說一個位元組能存0-255這256個數字,257、288、-158 之類的滾蛋,不待見,不認。其次,它也可以表示有符號的情況。我們從這8個格子中取第一個格子用來表示正號或是負號(0表示正,1表示負),所以 :11111111 就是-2^7=-128 (你可以暫時這麼認為,計算機原理有這麼簡單就好了),01111111 就是127 。不管怎麼定義,它也是隻能存256 個數字,但定義 的情況不同,那不受待見的東西就不一樣了。 位元組的意思明白後那就開始正視我們的問題了。在Java中 int這一型別 是給四個位元組的,也就是說它擁有 4*8=32 個格子 ,那它裡面最多能放32個1,最多能放32個0. 舉一反三前面說的,這種型別裡能放 2^32=4294967296 個數字  存有符的,那範圍就是 -2147483648(-2^31) --2147483647 (2^31-1). 無符的 0--4294967295。 但是,在Java 中沒有有符和無符這一說法,都是取有符這種情況,所以問題的答案是 -2147483648(-2^31) --2147483647 (2^31-1)。 (:多寫一句(好像不止一句        前面說在有符的情況下 11111111 這個表示-128 其實是有問題的,我們表面上研究時可以這麼理解,但在計算機底層,儲存的時候,就是如果你能看到儲存器這8個格子上這麼寫著8個1的時候,那它絕對不是表示 -128     它表示的是 -1 。    因為,在底層儲存的時候,負數都是取它 的補碼(新名詞)來儲存 的。首先,我這得一個數 -1 ,表示成2進位制的話10000001 ,得到這個我們叫它原碼;再對這個原碼除了符號位(也就是首位)之處的取反 得到:    11111110 ,得到這個我們叫它反碼;再對這個反碼+1,得到:11111111 ,得到這個我們叫它補碼 。把這個寫到儲存器上去。所以我們就會在儲存器上看到這個東西了,也就是為什麼 11111111 會是-1 了。   另外,正數的反碼、補碼都是它本身,也就是說正數不用做這些轉換。   那麼我們為什麼要這麼費勁地給負數來做這麼工作呢,其實一切都是為了計算 。   如果 ,我們按原碼 來計算的話     1 - 1 = 1 + (-1)= 00000001 + 10000001 = 10000010 (-2) 明顯不對嘛!   如果變成補碼來計算的話     1 - 1 = 1 + (-1)= 00000001 + 11111111 = 00000000 (0) 超過8 位後前面那一位會被擠掉(因為人家最多隻有8個格子嘛)!   所以,弄這個轉換是為了方便計算,尤其是對負數。 一切減法運算都改為加法,是為了簡化計算。