
目錄
- 整型之間的轉(zhuǎn)換總結(jié):
- 整型的值范圍
- 整型的隱式轉(zhuǎn)換
- 整型之間的轉(zhuǎn)換
- char類(lèi)型轉(zhuǎn)換為byte、short時(shí),必須使用顯式類(lèi)型轉(zhuǎn)換
- 當(dāng)byte,char或者short類(lèi)型(或?yàn)槿叩幕旌?參與運(yùn)算時(shí),結(jié)果為int類(lèi)型,而并非與較高的類(lèi)型相同
- byte轉(zhuǎn)char比較特殊,先將byte擴(kuò)展到int,然后再收縮到char,即擴(kuò)展收縮轉(zhuǎn)換
整型之間的轉(zhuǎn)換總結(jié):
如果變量的類(lèi)型是byte、short或char類(lèi)型,當(dāng)對(duì)其賦予編譯時(shí)期的常量,而該常量又沒(méi)有超過(guò)變量的取值范圍時(shí),編譯器就可以進(jìn)行隱式的收縮轉(zhuǎn)換。這種隱式的收縮轉(zhuǎn)換是安全的,因?yàn)樵撌湛s轉(zhuǎn)換只適用于變量的賦值,而不適用于方法調(diào)用語(yǔ)句,即不適用于方法調(diào)用時(shí)的參數(shù)傳遞。
注意char類(lèi)型,是一個(gè)無(wú)符號(hào)類(lèi)型。因此,char與short,char與byte之間的轉(zhuǎn)換都必須顯式地使用類(lèi)型轉(zhuǎn)換。
從byte到char的轉(zhuǎn)換為擴(kuò)展收縮轉(zhuǎn)換,該轉(zhuǎn)換比較特殊,即先將byte擴(kuò)展轉(zhuǎn)換到int,然后再收縮轉(zhuǎn)換到char。
在整型數(shù)據(jù)間的擴(kuò)展轉(zhuǎn)換中,如果操作數(shù)是char類(lèi)型(無(wú)符號(hào)類(lèi)型),則進(jìn)行無(wú)符號(hào)擴(kuò)展,擴(kuò)展位為0;如果操作數(shù)是byte、short或int(有符號(hào)類(lèi)型),則進(jìn)行有符號(hào)擴(kuò)展,擴(kuò)展位為該變量的符號(hào)位。
整型數(shù)據(jù)之間的收縮轉(zhuǎn)換,僅僅是截?cái)嗖G棄高位,不做任何其他處理。
整型的值范圍
byte:8位(一個(gè)字節(jié)8位),值范圍:-2?~ 2?, 即 -128 ~ 127
char:16位,無(wú)符號(hào)類(lèi)型,能表示的數(shù)值范圍為:0 ~ (21?-1) ,即 0 ~ 65535
// char類(lèi)型的最小值,Unicode的'\u0000'表示的是空字符,十進(jìn)制數(shù)字表示的是0
public static final char MIN_VALUE = '\u0000';
// char類(lèi)型的最大值,Unicode的'\uFFFF'轉(zhuǎn)換為十進(jìn)制數(shù)字時(shí),直接進(jìn)行無(wú)符號(hào)位擴(kuò)展到32位,即表示的數(shù)值為65535
public static final char MAX_VALUE = '\uFFFF';
short:16位,值范圍:-21? ~ (21?-1),即 -32768 ~ 32767
int:32位,值范圍:-231 ~ (231-1),即 -2147483648 ~ 2147483647
long:64位,值范圍:-2?3 ~ (2?3-1),即 -9223372036854775808 ~ 9223372036854775807
整型的隱式轉(zhuǎn)換
編譯時(shí)的整型字面常量(int類(lèi)型),如果將其賦值給比 int 類(lèi)型低的變量類(lèi)型(byte、short或char),而整型字面常量的值沒(méi)有超過(guò)該變量類(lèi)型的取值范圍,那么編譯器就可以做隱式類(lèi)型轉(zhuǎn)換。
byte b = 1; // 隱式類(lèi)型轉(zhuǎn)換,byte值范圍為:-128 ~ 127,1在此范圍內(nèi)
char c = 1; // 隱式類(lèi)型轉(zhuǎn)換,char能表示的數(shù)值范圍為:0 ~ 65535,1在此范圍內(nèi)
short s = 1; // 隱式類(lèi)型轉(zhuǎn)換,short值范圍為:-32768 ~ 32767,1在此范圍內(nèi)
編譯錯(cuò)誤
byte b1 = 128; // 編譯錯(cuò)誤,128超過(guò)了byte值范圍,產(chǎn)生編譯錯(cuò)誤
int i = 1;
以下產(chǎn)生編譯錯(cuò)誤,i不是整型字面常量,不能做隱式轉(zhuǎn)換,必須顯式強(qiáng)轉(zhuǎn)
byte b2 = i; // 編譯錯(cuò)誤,必須顯式強(qiáng)轉(zhuǎn):byte b2 = (byte) i;
char c2 = i; // 編譯錯(cuò)誤,必須顯式強(qiáng)轉(zhuǎn):char c2 = (char) i;
short s2 = i; // 編譯錯(cuò)誤,必須顯式強(qiáng)轉(zhuǎn):short s2 = (short) i;
隱式轉(zhuǎn)換的條件總結(jié):
- 整型字面常量
- 整型字面常量的值沒(méi)有超過(guò)要轉(zhuǎn)類(lèi)型的取值范圍
- 只適用對(duì)變量賦值,不適用于方法調(diào)用語(yǔ)句
整型之間的轉(zhuǎn)換
1. char類(lèi)型轉(zhuǎn)換為byte、short時(shí),必須使用顯式類(lèi)型轉(zhuǎn)換
char類(lèi)型是無(wú)符號(hào)類(lèi)型,值范圍是:0 ~ 65535,與byte(-128 ~ 127),short(-32768 ~ 32767)類(lèi)型不存在子集關(guān)系,因此char類(lèi)型與其他兩種類(lèi)型之間的轉(zhuǎn)換必須使用顯式類(lèi)型轉(zhuǎn)換。
char c = 'a';
byte b = (byte) c;
short s = (short) c;
2. 當(dāng)byte,char或者short類(lèi)型(或?yàn)槿叩幕旌?參與運(yùn)算時(shí),結(jié)果為int類(lèi)型,而并非與較高的類(lèi)型相同
byte b = 100;
char c = 50;
short s = 200;
int t1 = b + c; // byte類(lèi)型 + char類(lèi)型,結(jié)果為int類(lèi)型
int t2 = b + s; // byte類(lèi)型 + short類(lèi)型,結(jié)果為int類(lèi)型
int t3 = c + s; // char類(lèi)型 + short類(lèi)型,結(jié)果為int類(lèi)型
3. byte轉(zhuǎn)char比較特殊,先將byte擴(kuò)展到int,然后再收縮到char,即擴(kuò)展收縮轉(zhuǎn)換
<1> 擴(kuò)展轉(zhuǎn)換:
在整型數(shù)據(jù)間的擴(kuò)展轉(zhuǎn)換中,如果操作數(shù)是char類(lèi)型(無(wú)符號(hào)類(lèi)型),則進(jìn)行無(wú)符號(hào)擴(kuò)展,擴(kuò)展位為0
如果操作數(shù)是byte、short或int(有符號(hào)類(lèi)型),則進(jìn)行有符號(hào)擴(kuò)展,擴(kuò)展位為該變量的符號(hào)位。
<2> 收縮轉(zhuǎn)換:
整型數(shù)據(jù)之間的收縮轉(zhuǎn)換,僅僅是截?cái)嗖G棄高位,不做任何其他處理。