默認轉換(從小到大的轉換):
如果有byte、short、char類型的數據參與運算的話,那么他們首先會轉換為int類型。如果需要,然后以int-long-float-double這個順序轉換,byte、short、char相互之間不轉換,他們參與運算首先轉換為int類型
強制轉換(從大到小的轉換):
byte a = 3;
int b = 4;
byte c = ( byte ) ( a + b )
不要隨意使用強制轉換,從高精度到低精度,隱含了精度損失問題
注意:
byte b1 = 3, b2 = 4, b;
b = b1 + b2; //這個是錯誤的,因為兩個byte數據參與運算,首先他們要轉換成int類型,再作運算。
b = 3 + 4; //這個是正確的,先把結果計算出來,然后看是否在byte的范圍內,如果在,就不報錯。
內存溢出圖解:
為何
(byte)128=-128
(byte)129=-127
很簡單,因為byte支持的范圍為-128~127,所以只要想象這么一個循環圖,以此類推就好了。
內存溢出圖解
char類型的數據做運算,一定要記住這三個關鍵ASCII碼值:
'a' 97
'A' 65
'0' 8
char a = '0', b = '1' , c;
c = a + b; //錯誤,a和b為char類型,相加前要先轉換為
// int類型,a+b的結果為int類型,但c為char類型
c = (char) (a+b);
int d = a + b;
System.out.println(a); //值為'0'
System.out.println(b); //值為'1'
System.out.println(c); //值為'a'
System.out.println(d); //值為97
int-long-float-double順序中的小“問題”:
他們分別所占字節數:
int 4、long 8、float 4、double 8
細心的小朋友就會發現,明明float所占的字節數比long小,為何float還排在long的后面,long表示的精度范圍不應該比float大嗎?
其實:他倆的底層儲存結構不同,所表示的精度范圍也不能以同一種標準來評判,float的儲存方式詳見如下鏈接
他倆的數據范圍比較:
long:-2^63 ~ 2^63-1
float:-3.403×10^38 ~ 3.403×10^38
3.4×10^38 > 2×10^38 > 2×8^38 = 2×2338 = 2×2^114 > 2^63-1
float所表示的數據范圍遠遠大于long
.
.