Java中強制類型轉換
一、整型強轉
類型轉換都是小範圍向大範圍轉換的,大範圍往小範圍轉化需要用到強制轉換,轉換後的值會有所損失。
不同數據類型精度由小到大排列如下:byte --> short --> int --> long --> float --> double
先讓我們一起看看小精度數據類型向大精度數據類型轉換會出現什麼問題吧。
class test02{
public static void main(String[] args){
byte b1=100;
System.out.println(b1);
}
}
輸出結果如上,我們知道Java開發過程中數值默認輸出爲 int 型,但是明明 byte 比 int 小爲什麼輸出結果沒有問題呢?
那是因爲,100在byte型(- 128~127)數值的範圍內,所以輸出沒有問題,同理可得,只要被賦的值在小精度數據類型的範圍內,輸出結果都是沒有問題的。
那如果被賦的值超出範圍了會出現什麼問題呢?
class test02{
public static void main(String[] args){
byte b2=300;
System.out.println(b2);
}
}
輸出結果如上,它說:從int轉換到byte可能會有損失,那到底會損失成什麼樣呢? 損失的原理是什麼呢?
我們可以嘗試強制轉換,將int型強制轉換爲byte型,轉換的方法就是在被賦的值前面加(byte)
class test02{
public static void main(String[] args){
byte b3=(byte)300;
System.out.println(b3);
}
}
可以看到,經過強制轉換後的100變爲了44,原理如下:
int型數值的存儲大小爲4字節,byte爲1字節,那麼
int型 100 的二進制數爲00000000 00000000 00000001 0010 1100,強制轉換爲byte型數值後,它的二進制數就會變爲1字
節,前面的3個字節都會被損失掉,即變爲 0010 1100,將它換算爲十進制數就是輸出結果44啦~
哪麼兩個相加不超範圍的byte數,輸出結果會是怎樣的呢?
class test02{
public static void main(String[] args){
byte b7=50;
byte b8=50;
byte b9=b7+b8;
System.out.println(b9);
}
}
這是爲什麼呢? 50 + 50 =100,沒有超出範圍呀,怎麼還是報錯了呢?原因是這樣的:
b9並不知道b7和b8是什麼類型的數值,所以爲了避免出現二義性,該程序不予以計算,就出現了上述結果啦~
short轉int 如果賦值不當,出錯結果同上。
那麼我們再來看一段程序:
class test02{
public static void main(String[] args){
int i1=300;
int i2=300;
int i3=(int) i1 + i2;
System.out.println(i1);
System.out.println(i3);
}
}
咦~這次輸出結果怎麼沒有出現問題呢?
是因爲Java中默認數據類型爲int型,左右兩邊類型一致,當然不會出錯啦~
如果數值過大超出int型怎麼辦?答案就是在整數常量後面+ l 或者L將其轉換爲 long常量,那麼對於超級大的數字比如:1234456749143769471835, 超過long的取值範圍了怎麼辦?答案就是調用 BigInteger BigDecimal 兩個函數去解決。
二、浮點型強轉
由上述案例可得,從double轉換到float可能會有損失,所以解決方案就是在float類型的常量後面+F
class Test02{
public static void main(String[] args){
float f=3.14F;
System.out.println(f);
double d=10;
System.out.println(d);
double d1=3.14;
double d2=3.14;
double d3=d1+d2;
System.out.println(d3);
}
}
輸出結果如上。
如何打印一個字符變量呢?
先去碼錶中找到編號相對應的字符,然後將字符編號賦給字符變量,最後打印即可,比如在ASCII碼錶中小寫字母“a”對應97號,那麼就將97 賦給字符變量即可,代碼實現如下
class test02{
public static void main(String[] args){
char c1=97;
System.out.println(c1);
char c2='A';
System.out.println(c2);
}
}
還有就是將一個字符常量賦給字符變量時,那麼無論如何賦值,一旦打印結果一定是字符,如上。
字符變量在參與運算時,是以編號身份參加的,那麼如何查看'我'這個字符的編碼呢?直接輸出 System.out.println('我'+0);查看
我 的編碼是多少,然後再輸出打印即可。
同理,我 前後的字符也可以由此實現,具體代碼如下。
class test02{
public static void main(String[] args){
System.out.println('我'+0);
char c= 25105;
System.out.println(c);
System.out.println((char)('我'+1));
System.out.println((char)('我'-1));
System.out.println((char)8888888);
}
}
爲啥會出現問號呢?是因爲ASCII碼錶中沒有該編號,所以出現了 問號。