1. 概述
Java語言內置了八種基本數據類型:六種數字類型(四個整數型查排,兩個浮點型)闹伪,一種字符類型吁讨,還有一種布爾型疚顷。
其中int 數據類型是++32位++旱易、++有符號++的以++二進制補碼++表示的整數
最小值是 -2,147,483,648(-2^31);
最大值是 2,147,483,647(2^31 - 1)腿堤;
一般的整型變量默認為 int 類型咒唆;
int的默認值是 0
public class Test {
public static void main(String[] args) {
System.out.println("二進制長度:" + Integer.SIZE);
System.out.println("最小值Integer.MIN_VALUE = " + Integer.MIN_VALUE);
System.out.println("最大值Integer.MAX_VALUE = " + Integer.MAX_VALUE);
}//歡迎加入Java開發(fā)交流君樣:909038429
}
輸出結果:
二進制長度:32
最小值Integer.MIN_VALUE = -2147483648
最大值Integer.MAX_VALUE = 2147483647
2. 補碼
Java里的int是有符號的,二進制系統(tǒng)是通過補碼來保存數據的释液,最高位為1的數字用來表示負數,而最高位為0的數字表示非負數装处。
正數補碼等于原碼误债,負數的補碼等于其絕對值的反碼+1。例如:-1的補碼就是絕對值1的反碼(按位取反) 再+1妄迁。計算方式如下:
0000 0000 0000 0000 0000 0000 0000 0001 => 1的二進制
1111 1111 1111 1111 1111 1111 1111 1110 => 1的反碼
+ 0000 0000 0000 0000 0000 0000 0000 0001
-----------------------------------------
1111 1111 1111 1111 1111 1111 1111 1111 => -1的補碼
常見整數對應的補碼:
1000 0000 0000 0000 0000 0000 0000 0000 => -2147483648
1111 1111 1111 1111 1111 1111 1111 1111 => -1
0000 0000 0000 0000 0000 0000 0000 0000 => 0
0000 0000 0000 0000 0000 0000 0000 0001 => 1
0111 1111 1111 1111 1111 1111 1111 1111 => 2147483647
例:獲取整數二進制
public class Test {
public static void main(String[] args) {
int[] arrayInt = new int[] {Integer.MAX_VALUE, 0, 1, -1, Integer.MIN_VALUE};
for (int x : arrayInt) {
String binaryString = Integer.toBinaryString(x);
int length = Integer.SIZE;
while(binaryString.length() < length){
// 在不足的位數前加“0”
binaryString = "0" + binaryString;
}
// 為了方便查看寝蹈,每4位插入分割符
int m = binaryString.length()/4 - 1;
StringBuffer stringBuffer = new StringBuffer(binaryString);
for (int i = m; i > 0; i--) {
int j = 4 * i;
stringBuffer.insert(j,' ');
}
System.out.printf("%,14d", x);
System.out.print(" 對應的二進制為:");
System.out.printf("%s%n", stringBuffer.toString());
}//歡迎加入Java開發(fā)交流君樣:909038429
}
}
輸出結果:
2,147,483,647 對應的二進制為:0111 1111 1111 1111 1111 1111 1111 1111
0 對應的二進制為:0000 0000 0000 0000 0000 0000 0000 0000
1 對應的二進制為:0000 0000 0000 0000 0000 0000 0000 0001
-1 對應的二進制為:1111 1111 1111 1111 1111 1111 1111 1111
-2,147,483,648 對應的二進制為:1000 0000 0000 0000 0000 0000 0000 0000
3. 數據溢出
首先,基本的數據類型(long登淘,int箫老,short,byte黔州,char耍鬓,float阔籽,double)都有自己能夠保存的數據范圍。
數據溢出:
當某一種類型的數值已經達到了此類型能夠保存的最大值之后牲蜀,再繼續(xù)擴大笆制,或者達到了最小值后再繼續(xù)縮小,就會出現數據溢出問題涣达。而溢出不會出錯在辆,卻會得到一個意外的結果:
public class MyDemo{
public static void main(String args []){
int a = Integer.MAX_VALUE;//定義一個int型變量a的值為int型能夠保存的最高值
System.out.println(a + 1);
int b = Integer.MIN_VALUE;//定義一個int型變量a的值為int型能夠保存的最小值
System.out.println(b - 1);
}
}
輸出結果:
-2147483648
2147483647
下面解釋出現這種情況的原因:
0111 1111 1111 1111 1111 1111 1111 1111 => 2147483647的補碼
+ 0000 0000 0000 0000 0000 0000 0000 0001
-----------------------------------------
1000 0000 0000 0000 0000 0000 0000 0000 => -2147483648的補碼
最輕微的上溢是 INT_MAX + 1 :結果是 INT_MIN。
最嚴重的上溢是 INT_MAX + INT_MAX :結果是 -2度苔。
最輕微的下溢是 INT_MIN - 1 :結果是 INT_MAX匆篓。
最嚴重的下溢是 INT_MIN + INT_MIN :結果是 0。
最大值加1時寇窑,反而變成范圍的最小值鸦概,加2變成范圍的次小值,這種情況可以想象出一個循環(huán)疗认。
數據溢出的解決辦法:
我們已經知道完残,在整型中,能夠保存的數值范圍最大的是long型横漏;在浮點型中谨设,能夠保存的數值范圍最大的是double型。所以在遇到數據溢出問題時缎浇,我們可以先把能夠保存的數值范圍小的類型轉換為范圍大的類型扎拣,再進行運算素跺。
例:
public class Test{
public static void main(String args []){
//定義一個int型的最大值
int x = Integer.MAX_VALUE;
System.out.println((long)x+2);
}
}
輸出結果是:2147483649
最新2020整理收集的一些高頻面試題(都整理成文檔)二蓝,有很多干貨,包含mysql指厌,netty鸥诽,spring,線程,spring cloud、jvm帝火、源碼犀填、算法等詳細講解疏日,也有詳細的學習規(guī)劃圖睬辐,面試題整理等隘谣,需要獲取這些內容的朋友請加Q君樣:909038429
/./*歡迎加入java交流Q君樣:909038429一起吹水聊天