這個是Integer類中的一個int類型的常量MAX_VALUE
它代表int所能表示的最大值 0x7FFFFFFF
相對應的是Integer類中的另一個常量MIN_VALUE
它代表int所能表示的最小值 0x80000000
整型的其他的子型也可以 byte short long?
基本類型之間不存在子型和父型,只是范圍不同,
小范圍轉換為大范圍可以直接轉換
大范圍轉換小范圍需要強制轉換符號,
例如:
long lv=123456;
int v=(int) lv;
數字基本類型都有對應的類及最大最小值常量
Byte.MAX_VALUE =0x7F
Byte.MIN_VALUE =0x80
Short.MAX_VALUE =0x7FFF
Short.MIN_VALUE =0x8000
Integer.MAX_VALUE =0x7FFFFFFF
Integer.MIN_VALUE =0x80000000
Long.MAX_VALUE =0x7FFFFFFFFFFFFFFF
Long.MIN_VALUE =0x80000000000000000
java源代碼:
Integer.MAX_VALUE經常會在集合中用到,對這個概念一直沒有深究過,查看一下源碼。
一個常數,持有了int類型數最小值,-2^31次方,-2147483648。負21億多。
/**
* A constant holding the minimum value an {@code int} can
* have, -2<sup>31</sup>.
*/
@Native public static final int MIN_VALUE = 0x80000000;
一個常數,持有了int類型數的最大值,2^31次方,2147483648,正21億多
/**
* A constant holding the maximum value an {@code int} can
* have, 2<sup>31</sup>-1.
*/
@Native public static final int MAX_VALUE = 0x7fffffff;
解釋:
1、0x80000000
0x表示16進制
80000000一共8位16進制,也就是32位的2進制,2進制寫法位數太多了,不展開寫了,這也是為什么用16進制表示的原因。
1000 后面28個0,前面1表示負數,后面的27個0,這個應該是補碼,那就是-1,會得到27個1,然后再求反碼,27個0,納尼???
因為這個數達到了32位二進制的上限,所以我們不會再去按照-1,再反碼的方式求真正的值,直接按照原碼的負數計算即可。也就是-2^31次方。
2、0x7fffffff
展開就是0111后面28個1,也就是一共31個1的整數,2^31 - 1
3、MAX_VALUE + 1 == MIN_VALUE
這他媽就好玩了,0111 1111 1111 1111 1111 1111 1111 1111+1 = 1000 0000 0000 0000 0000 0000 0000 0000 沒毛病。
或者這么想,我們把計算機的“模”從中間剖開,負數逆時針,正數順時針,正數從0到6點鍾,包括0不包括6點鍾,負數從0到6點鍾,不包括0,包括6點鍾,MAX_VALUE再往前+1,就是MIN_VALUE
Integer.MIN_VALUE,即-2147483648,二進制位如下:
1000 0000 0000 0000 0000 0000 0000 0000
在計算機的運算中,“-”(前綴)運算表示各二制位取反再加1,也就是說 b = -a 在計算機內部是 b = ~a + 1 這樣處理的,所以上面的位就變成了:
1000 0000 0000 0000 0000 0000 0000 0000 Integer.MIN_VALUE
取反 0111 1111 1111 1111 1111 1111 1111 1111 (取反之后變成了Integer.MAX_VALUE)
加1 1000 0000 0000 0000 0000 0000 0000 0000 -Integer.MIN_VALUE(與原來的結果一樣)