在java基礎類型中,int類型占四個字節,而每個字節在內存中占8位(8byte),所以可以使用共4X8=32個位數來存儲該類型,也就是四個八位的二進制數,所以有了以下說法
在計算機中,它的二級制表示為四個長度為8的二進制數,00000000 00000000 00000000 00000000,不了解的同學可以補一下原碼,反碼和補碼的概念,計算機中的數字是以補碼的形式存儲的
正數的原碼 補碼 是相同的,負數不同,負數反碼為除符號位的其它位數取反,補碼為反碼加一,引入反碼 補碼是為了表示負數來區別開正數,因為二進制沒有正負的區別,要區別就得加個標識,就是符號位,按約定,最高位為符號位
首位加粗的0就是是符號位,根據正負要求固定為0或1,為0則代表正數,為1則代表負數
所以實際可用的位數是31位,若為負數,最小表示時,首位為1,其余位數全部為1,則為111111111 11111111 11111111 11111111,其補碼為10000000 00000000 00000000 00000001轉換成十進制就是-2147483647,即-2^31 + 1,那么看到這里,大家都應該認為int的范圍是 -2^31 + 1 到2^31 -1,也就是-2147483647到2147483647,那為什么負數最小能表示到-2147483648 即-2^31呢?問題就出在0上
0的補碼,數0的補碼表示是唯一的, 例:[+0]補=[+0]反=[+0]原=00000000,[-0]補=11111111+1=00000000
在二進制中,0有兩種表方法。+0的原碼為0000 0000 0000 0000 0000 0000 0000 0000,-0的原碼為1000 0000 0000 0000 0000 0000 0000 0000,因為0只需要一個,而取正0作為0來區別正數和負數
巧合的是-2147483648的補碼表示為1000 0000 0000 0000 0000 0000 0000 0000,與-0的原碼是一致的,這樣,-0便被利用起來,存儲-2147483648。
而正數,最大表示時,首位符號位為0,其余位數為1,則為01111111 11111111 11111111 11111111,即2^31-1(2147483647),如果不減一,就是2^31(2147483648),這是你發現2^31二進制補碼表示為11111111 11111111 11111111 11111110 ,符號位被占用了而且為1
而符號位為1則代表負數,也就是位數不夠用了,若想表示成正數需要多一位表示符號,即 01111111 11111111 11111111 11111110,這樣就變成了33位,超出表示范圍
所以,java中int類型表示范圍是-2^31到2^31-1,大概是21億左右,注意超出這個范圍的數據不要用int類型接受,會有精度問題
