Java之int及它的取值範圍
int是Java中的8種基本型別之一,一個int值佔4個byte(8個二進位制位)
8中基本型別所佔位元組分別是多少:
- int 4個位元組
- short 2個位元組
- long 8個位元組
- char 2個位元組
- float 4個位元組
- double 8個位元組
- boolean 沒有提供size的方法
思考:一個int,它的取值範圍是多少呢?在記憶體中又是怎麼儲存的呢?
答案:它的取值範圍是:【-2的31次方(-2147483648),2的31次方減一(2147483647)】,它在記憶體中是以補碼(對應正數的二進位制位取反,加1)的形式儲存的
先上程式碼,通過下面程式碼的執行結果觀察
public class Test {
public static void main(String[] args) {
// 2的31次方
int j = (int) Math.pow(2,31);
System.out.println("j的值" + j);
}
}
執行結果:
j的值2147483647
繼續修改程式碼
public class Test {
public static void main(String[] args) {
// 2的31次方
int j = (int) Math.pow(2,32);
System.out.println("j的值" + j);
}
}
執行結果(同上面程式碼):
j的值2147483647
再次修改程式碼
public class Test {
public static void main(String[] args) {
int j = 2147483647;
System.out.println("j的值" + (j + 1));
}
}
執行結果:
j的值-2147483648
這裡是負值,int型最小值
當int的最大值+1後,會變成int的最小值
故:java中int的取值範圍是2的32次方,最大值是2的31次方,最小值是負值的2的31次方-1
首先要明確兩個概念:(1)一個數在計算機中儲存的是它的補碼。
(2)Math.abs(a)中的-a對應計算機在內部的操作是:將a在計算機中的儲存值(a的補碼)所有位(32位)取反之後加1。
因此,-128在計算機中儲存的是它的補碼(它對應的正數的所有位取反+1):
128用二進位制表示是:00000000 00000000 00000000 10000000
128所有位取反是:11111111 11111111 11111111 01111111
加1之後是:11111111 11111111 11111111 10000000(這個就是-128在計算機中儲存的值(補碼))
如果我們呼叫Math.abs(-128),機器會怎麼做呢?
首先,取反:00000000 00000000 00000000 01111111
加一:00000000 00000000 00000000 10000000(128)
因此Math.abs(-128)的結果就是128.
同理,Math.abs(-2147483648)也是這樣的操作:
-2147483648在計算機中儲存的值是:10000000 00000000 00000000 00000000
Math.abs(-2147483648)中 -a操作,首先取反:01111111 11111111 11111111 11111111
然後加一:10000000 00000000 00000000 00000000
而上面這個數,計算機識別為-2147483648
補充知識:
對於正數來說,它的補碼就是它本身。
對於負數來說,它的補碼是它對應的正數的二進數所有位取反之後加一。
由負數的補碼求原碼也是相同的操作(所有位取反+1)即為該負數的絕對值
int是4個位元組,32位,
10000000 00000000 00000000 00000000 是補碼,第一位為符號位,1表示負數,所以
對剩下的位取反,結果為 1111111 11111111 11111111 11111111,加一後為10000000 00000000 00000000 00000000
所以原碼指的是-2^31=-2147483648
int的取值範圍為-2^31——2^31-1
在計算機中,負數的補碼為:正值二進位制取反+1。
注意: 1111111 11111111 11111111 11111111表示-1