Java基本數據類型有四類八種:
整數型 | 小數型 | 字符型 | 布爾型 |
---|---|---|---|
byte、 short、 int、 long | float 、double | char | boolean |
數據類型的轉換主要有以下規則:
1.小的數據類型會自動轉爲大的數據類型,反之需要強制類型轉換。
2.所有字面值是整數的默認是int類型。
將2147483648賦值給long類型,報錯:Integer number too large,明明沒有超過long表示的範圍:
long i=2147483648;//Integer number too large;
解釋:如果要將一個整數賦值給long類型,需要在賦值的數字後加L/l指明是long類型。
long i=2147483648L;//ok;
再看下面:
byte b=127;//ok;
不是說好字面值是整數的默認是int類型嗎,爲什麼這裏的數字賦值給byte類型不會報錯?
解釋:因爲java在編譯時期會進行判斷,如果你賦值的數值沒有超過byte、short的最大範圍,則編譯不會報錯。這裏的127沒有超過byte的最大表示範圍。
byte b=128;//Required byte,Found int;
3.所有字面值是小數的默認是double類型。
float f=2.7;//Required flout,Found double;
解釋:如果要將一個小數賦值給float類型,需要在賦值的小數後加F/f指明是float類型:
float f=2.7F;//ok;
4.java中的char類型本質上是整數,範圍是0~65535。
因爲計算機無法存儲真正的字符,它只認數字。所以需要將字符按照一定的編碼規則轉換成數字存儲。
char c='a';//ok
char i=65535;//ok
但是:
short s=2;
char i=s;///Required char,Found short;
不是說好char可以直接存儲數字嗎?爲什麼將變量類型爲short類型的數值賦值給char會報錯呢?
解釋: 關鍵是char沒有負數,你賦值的是變量,人家也保證不了你不給負數,所以乾脆不讓你這麼幹了。
5.兩個不同整數類型進行計算,會將小的那一個數據類型提升爲大的一方,再進行計算
short s1=777;
int i2=66;
short total=s1+i2;//Error:不兼容的類型: 從int轉換到short可能會有損失
s1會自動提升爲int,然後再進行計算,兩個int計算的結果爲int ,這時賦值給short當然報錯了。那爲什麼兩個不同整數類型進行計算,會將小的那一個數據類型提升爲大的一方?
解釋: java中,數值運算不是口算,計算機的世界就是0和1表示的二進制,這裏的short 和 int 類型的兩個數字需要轉換成二進制的補碼進行計算,但是問題來了,short類型佔2個字節,int 佔4個字節,驢脣不對馬嘴,計算機沒法玩了,只能把short轉成int再計算。