1. 程式人生 > 實用技巧 >java基礎-06:資料型別轉換

java基礎-06:資料型別轉換

資料型別轉換

轉換關係:

  • 自動(隱式)型別轉換
  • 強制(顯式)型別轉換

自動(隱式)型別轉換

定義:數字表示範圍小的資料型別可以自動轉換成範圍大的資料型別。

注意點:

  • byte、short、char 運算時直接提升為 int 。
  • boolean型別不能發生資料型別轉換。
  • 整型資料型別預設是int型別。
  • 浮點型資料型別預設是double型別。
  • byte、short、char‐‐>int‐‐>long‐‐>float‐‐>double。

上圖為敬:

注意:下圖中實線表示自動轉換時不會造成資料丟失,虛線則可能會出現資料丟失問題。

案例介紹

1、int型別和byte型別運算,結果是int型別,byte型別自動提升為int型別

int a = 1; 
byte b = 2; 
// byte x = a + b; // 報錯,byte型別裝不下int型別
int y = a + b;  //int+byte-->int+int-->int    
System.out.println(y);//3

2、int型別和double型別運算,結果是double型別,int型別會提升為double型別

int i = 1; 
double d = 2.5; 
//int e =d+i;  //報錯,int型別裝不下double型別
double e = d+i; //int+double-->double+double-->double
System.out.println(e); //3.5

3、左邊是double型別,右邊是float型別,左右不一樣

double num = 2.5F;// float --> double,符合從小到大的規則,自動轉換。
System.out.println(num); // 2.5

4、賦值時,右側的數值大小不能超過左側的類型範圍,否則會有資料溢位問題

byte num4 = 40; // 注意!右側的數值大小不能超過左側的類型範圍
byte num5 = 50;// byte + byte --> int + int --> int
int result1 = num4 + num5;
System.out.println(result1); // 90

5、浮點型之間的運算可能不太準確

float a = 1.1F; float b = 2.2F;
//int i = a + b; // 報錯,int型別裝不下double型別
float i = a+b;
System.out.println(i);//3.3000002

6、char運算時直接提升為int 。計算機的底層會用一個數字(二進位制)來代表字元A,就是65。一旦char型別進行了數學運算,那麼字元就會按照一定的規則翻譯成為一個數字。

char c= 'A'; // 這是一個字元型變數,裡面是大寫字母A
System.out.println(c + 1); // 66,也就是大寫字母A被當做65進行處理。char+int-->int+int-->int

資料溢位問題

例如:

int count = 100000000;
int price = 1999;
long totalPrice = count * price;

結果:編譯沒任何問題,但結果卻輸出的是負數。
原因:這是因為兩個 int 相乘得到的結果是 int, 相乘的結果超出了 int 的代表範圍。
解決:一般把第一個資料轉換成範圍大的資料型別再和其他的資料進行運算。

int count = 100000000;
int price = 1999;
long totalPrice = (long) count * price;

強制(顯式)型別轉換

定義:將取值範圍大的型別強制轉換成取值範圍小的型別

格式:資料型別 變數名 = (資料型別)被轉資料值;

注意事項:如果超出了被賦值的資料型別的取值範圍得到的結果會與你期望的結果不同。

案例介紹

1、浮點轉成整數,直接取消小數點,可能造成資料損失精度

//int a = 1.5; // 錯誤
int a = (int)1.5;//正確,不會四捨五入,小數點後面的資料直接捨去,a 的值變為1。//double-->int
System.out.println(a); //1

2、int 強制轉成 short 砍掉2個位元組;注意必須保證邏輯上真實大小本來就沒有超過short範圍,否則會發生資料溢位

int b =(int)2.3;//b的值為2
short c =1;
//c =b+c; //錯誤
c=(short)(b+c);//編譯成功//int +short-->int+int-->short+short-->short
System.out.println(c); //3
byte num1 = 40;
short num2 = 60;
short result = (short) (num1 + num2);// byte + short --> int + int --> int
System.out.println(result); // 100

3、賦值時,右側的數值大小不能超過左側的類型範圍,超出會報錯,進行強轉後不報錯,但資料會溢位、丟失

byte num1 = (byte)4000; //資料超出byte範圍
byte num2 = 50;
int result= num1 + num2;
System.out.println(result); // -46,資料出現異常

4、左邊是int型別,右邊是long型別,不一樣,long --> int,不是從小到大,需強轉為int型別

int num = (int)30L;
System.out.println(num);// 30