Java強制類型轉換的所有規(guī)則及說明
強制轉換
在Java中,我們也可以將==數據取值范圍大的轉換為數據取值范圍小到的==,這種轉換并不是自動的過程,而是需要我們手動的轉換,我們稱這種轉換為強制轉換。
例如下面代碼:
long a = 10; int b = a; // 報錯
long類型內存8個字節(jié),int類型內存4個字節(jié)。
long取值范圍大于int;想要賦值成功,只有通過強制類型轉換,將 long類型強制轉換成int類型才能賦值。
強制轉換:將 取值范圍大的類型 強制轉換成 取值范圍小的類型;比較而言,自動轉換是Java自動執(zhí)行的,而強制轉換需要我們自己手動執(zhí)行。
強制轉換格式:
數據類型 變量名 = (數據類型)被轉數據值;
將 1.5 賦值到 int 類型,代碼修改為:
long a = 10; int b = (int)a;
同樣道理,當一個 short 類型與 int 類型相加,我們知道會類型提升,但是還想給結果賦值給 short 類型變量,就需要強制轉換。
/**
* @author lscl
* @version 1.0
* @intro:
*/
public class Demo04 {
public static void main(String[] args) {
// short類型變量,內存中存儲兩個字節(jié)
short s = 1;
int i = 1;
/*
出現(xiàn)編譯錯誤
s和i做運算的時候,i是int類型,s會被提升為int類型
s+i后的結果是int類型,將結果在賦值會short類型時發(fā)生錯誤
*/
// s = s + i; // 編譯失敗
s = (short) (s + i); // 強制轉換,編譯成功
System.out.println(s);
}
}
1.轉換圖解
short 類型內存占有2個字節(jié),在和 int類型運算時會提升為 int 類型 ,自動補充2個字節(jié),計算后的結果還是 int 類型,但最終被強轉為了short類型,占用2個字節(jié)空間。

2.浮點數與整數的底層存儲
下面是8個基本數據類型的取值范圍大?。?/p>
| 數據類型 | 關鍵字 | 內存占用 | 取值范圍 |
|---|---|---|---|
| 字節(jié)型 | byte | 1個字節(jié) | -128~127 |
| 短整型 | short | 2個字節(jié) | -32768~32767 |
| 整型 | int(默認) | 4個字節(jié) | -2147483648~2147483647 |
| 長整型 | long | 8個字節(jié) | -2的63次方~2的63次方-1 |
| 單精度浮點數 | float | 4個字節(jié) | 1.4013E-45~3.4028E+38 |
| 雙精度浮點數 | double(默認) | 8個字節(jié) | 4.9E-324~1.7977E+308 |
| 字符型 | char | 2個字節(jié) | 0-65535 |
| 布爾類型 | boolean | 1個字節(jié) | true,false |
我們可以發(fā)現(xiàn),int和float都是占用4個字節(jié)大小,但是float的取值范圍卻比int要大的多。同樣的情況在long與double這兩種類型上也存在;
這是為什么呢?
double與long表示范圍的差距是由于存儲結構的不同導致的,換句話說我們保存1000這個數,我們long要存儲+1000,其二進制為001111101000,而double存儲的是+1E3。
拆開來看,存儲一個數double可以分成三部分:
- 尾數位(1)
- 基數位(10)
- 指數位(3)
也就是用科學計數法來存儲,這簡單的1000就能看出差距,long存儲1000需要符號位(+)和數字位(1000),需要5位。而double存儲,卻只需要3位。
同樣一個數,double能夠用更少的內存存儲,所以多余的內存就能存儲更多的數,因此double > long
通過如下代碼可以查看到每個類型的最大值:
/**
* @author lscl
* @version 1.0
* @intro:
*/
public class Demo01 {
public static void main(String[] args) {
// 2147483647
System.out.println(Integer.MAX_VALUE);
// 3.4028235E38
System.out.println(Float.MAX_VALUE);
// 9223372036854775807
System.out.println(Long.MAX_VALUE);
// 1.7976931348623157E308
System.out.println(Double.MAX_VALUE);
}
}
3.整數之間的強制轉換
強制轉換指的是:取值范圍大的,轉換為取值范圍小的。強制轉換的時候尤其要注意轉換之后的類型是否能存儲之前的數據。
示例1:數值==沒有超出==轉換之后類型的取值范圍的情況
/**
* @author lscl
* @version 1.0
* @intro:
*/
public class Demo05_強制類型轉換_整數轉換_01 {
public static void main(String[] args) {
int a = 100;
byte b = (byte) a;
// byte也能存儲100,因此轉換的時候不會出現(xiàn)什么問題
System.out.println(b); // 100
}
}
示例2:數值==超出了==轉換之后類型的取值范圍的情況
/**
* @author lscl
* @version 1.0
* @intro:
*/
public class Demo06_強制類型轉換_整數轉換_02 {
public static void main(String[] args) {
// 八個字節(jié): 00000000 00000000 0000000 10000100 01000000 11000000 11000000 10000000 ---> 十進制: 568022057088
long a = 568022057088L;
// 四個字節(jié): 01000000 11000000 11000000 10000000 ---> 十進制: 1086374016
int b = (int) a;
System.out.println(b); // 1086374016
// 兩個字節(jié): 11000000 10000000 ---> 十進制: -16256
short c = (short) b;
System.out.println(c); // -16256
// 一個字節(jié): 10000000 ---> 十進制: -128
byte d = (byte) c;
System.out.println(d); // -128
}
}
4.浮點數的強制轉換
1) 浮點數轉浮點數
示例1:數值==沒有超出==轉換之后類型的取值范圍的情況
/**
* @author lscl
* @version 1.0
* @intro:
*/
public class Demo07_強制類型轉換_浮點數轉浮點數_01 {
public static void main(String[] args) {
double a = 180.8D;
float b = (float) a;
System.out.println(b); // 180.8
}
}
示例2:數值==超出了==轉換之后類型的取值范圍的情況
/**
* @author lscl
* @version 1.0
* @intro:
*/
public class Demo07_強制類型轉換_浮點數轉浮點數_02 {
public static void main(String[] args) {
double a = 3.8E38D;
float b = (float) a;
// float的最大取值范圍為: 1.4013E-45~3.4028E+38,無法存儲3.8E38,賦值失敗
System.out.println(b); // Infinity
}
}
超出最大容量:

2) 浮點數轉整數
浮點數強制轉換為整數類型時也會出現(xiàn)一定的問題;
示例1:浮點數強制轉換為整數,數值==沒有超出==轉換之后類型的取值范圍的情況
/**
* @author lscl
* @version 1.0
* @intro:
*/
public class Demo09_強制類型轉換_浮點數轉整數_01 {
public static void main(String[] args) {
double a = 18.8D;
// 取值范圍: -2的63次方~2的63次方-1
long b = (long) a;
// 取值范圍: -2147483648~2147483647
int c = (int) a;
// 取值范圍: -32768~32767
short d = (short) a;
// 取值范圍: -128~127
byte e = (byte) a;
System.out.println(a); // 18.8
System.out.println(b); // 18
System.out.println(c); // 18
System.out.println(d); // 18
System.out.println(e); // 18
}
}
Tips:浮點數轉成整數后將會丟失精度,即小數點后面的通通丟失(注意,并不是四舍五入)
示例2:浮點數強制轉換為整數(long和int類型),數值==超出了==轉換之后類型的取值范圍的情況
/**
* @author lscl
* @version 1.0
* @intro:
*/
public class Demo10_強制類型轉換_浮點數轉整數_02 {
public static void main(String[] args) {
double a = 5.2E63;
// 取值范圍: -2的63次方~2的63次方-1
long b = (long) a;
// 取值范圍: -2147483648~2147483647
int c = (int) a;
System.out.println(a); // 5.2E63
System.out.println(b); // 9223372036854775807(long的最大值)
System.out.println(c); // 2147483647(int的最大值)
}
}
Tips:當強制超出該類型的范圍時:如果是轉換為long或int類型,默認為該類型的最大取值范圍值
執(zhí)行結果:

示例3:浮點數強制轉換為整數(short和byte類型),數值==超出了==轉換之后類型的取值范圍的情況
在Java中,將double或float轉換為short/byte時,數值將首先轉換為int,然后轉換為short/byte,如果該數組超出了int的取值范圍,那么轉換為short或者byte時結果為-1,如果沒有超出int范圍,那么如果轉換為short將會截取2個字節(jié),轉換為byte將會截取1個字節(jié)。
示例代碼:
/**
* @author lscl
* @version 1.0
* @intro:
*/
public class Demo11_強制類型轉換_浮點數轉整數_03 {
public static void main(String[] args) {
/*
int的取值范圍(4個字節(jié)): -2147483648~2147483647
short取值范圍(2個字節(jié)): 取值范圍: -32768~32767
byte取值范圍(1個字節(jié)): -128~127
*/
// 超出了int范圍,直接為-1
System.out.println((short) 2147483648.8D); // -1
// 在int范圍內,截取兩個字節(jié)
// 01111111 11111111 11111111 11111100 ---> 2147483644
// 11111111 11111100 ---> -4
System.out.println((short) 2147483644.4D); // -4
// 在int范圍內,截取兩個字節(jié)
// 00000000 00001100 01101110 10110110 ---> 814774
// 01101110 10110110 ---> 28342
System.out.println((short) 814774.8D); // 28342
// 超出了int范圍,直接為-1
System.out.println((byte) 2147483648.8D); // -1
// 在int范圍內,截取1個字節(jié)
// 01111111 11111111 11111111 11111100 ---> 2147483644
// 11111100 ---> -4
System.out.println((byte) 2147483644.4D); // -4
// 在int范圍內,截取1個字節(jié)
// 00000000 00001100 01101110 10110110 ---> 814774
// 10110110 ---> -74
System.out.println((byte) 814774.8D); // -74
}
}
總結
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
IDEA2022.1創(chuàng)建maven項目規(guī)避idea2022新建maven項目卡死無反應問題
這篇文章主要介紹了IDEA2022.1創(chuàng)建maven項目規(guī)避idea2022新建maven項目卡死無反應問題,本文通過圖文并茂的形式給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2022-08-08
深入分析Android系統(tǒng)中SparseArray的源碼
這篇文章主要介紹了深入分析Android系統(tǒng)中SparseArray的源碼,SparseArray為Java實現(xiàn),需要的朋友可以參考下2015-07-07
淺談spring中的default-lazy-init參數和lazy-init
下面小編就為大家?guī)硪黄獪\談spring中的default-lazy-init參數和lazy-init。小編覺得挺不錯的,現(xiàn)在就分享給大家,也給大家做個參考。一起跟隨小編過來看看吧2017-04-04
mybatis-plus集成springboot實現(xiàn)XML映射器方式
本文詳細介紹了MyBatis-Plus中SQL映射配置的使用方法,包括動態(tài)SQL的支持和常見SQL操作的實現(xiàn),通過XML映射器,可以靈活地定義復雜的查詢語句,并處理動態(tài)條件和批量操作,文中還提供了具體的配置步驟和示例代碼,幫助開發(fā)者更好地理解和應用這些功能2026-03-03
在非Spring管理對象中注入Spring Bean的解決方案
在SpringBoot開發(fā)中,我們習慣了通過@Autowired/@Resource等注解輕松注入依賴 Bean,但在WebSocket、定時任務等場景下,會遇到一個核心問題:非Spring創(chuàng)建的對象無法直接注入 Spring Bean,所以本文給大家介紹了在非Spring管理對象中注入Spring Bean的解決方案2026-02-02
java并發(fā)編程中實現(xiàn)可見性的四種可行方案解析
這篇文章主要介紹了java并發(fā)編程中實現(xiàn)可見性的四種可行方案解析,使用關鍵字volatile和使用鎖(如synchronized關鍵字或者java.util.concurrent包中的鎖)來確保對共享變量的修改在多線程環(huán)境中能夠正確地被其他線程所觀察到,需要的朋友可以參考下2023-08-08

