Java面试 - 整型之间的转换

165 阅读4分钟

整型之间的转换总结:

  1. 如果变量的类型是byte、short或char类型,当对其赋予编译时期的常量,而该常量又没有超过变量的取值范围时,编译器就可以进行隐式的收缩转换。这种隐式的收缩转换是安全的,因为该收缩转换只适用于变量的赋值,而不适用于方法调用语句,即不适用于方法调用时的参数传递。

  2. 注意char类型,是一个无符号类型。因此,char与short,char与byte之间的转换都必须显式地使用类型转换。

  3. 从byte到char的转换为扩展收缩转换,该转换比较特殊,即先将byte扩展转换到int,然后再收缩转换到char。

  4. 在整型数据间的扩展转换中,如果操作数是char类型(无符号类型),则进行无符号扩展,扩展位为0;如果操作数是byte、short或int(有符号类型),则进行有符号扩展,扩展位为该变量的符号位。

  5. 整型数据之间的收缩转换,仅仅是截断并丢弃高位,不做任何其他处理。


整型的值范围

byte:8位(一个字节8位),值范围:-2⁷~ 2⁷, 即 -128 ~ 127

char:16位,无符号类型,能表示的数值范围为:0 ~ (2¹⁶-1) ,即 0 ~ 65535

// char类型的最小值,Unicode的'\u0000'表示的是空字符,十进制数字表示的是0
public static final char MIN_VALUE = '\u0000';
// char类型的最大值,Unicode的'\uFFFF'转换为十进制数字时,直接进行无符号位扩展到32位,即表示的数值为65535
public static final char MAX_VALUE = '\uFFFF';

short:16位,值范围:-2¹⁵ ~ (2¹⁵-1),即 -32768 ~ 32767

int:32位,值范围:-2³¹ ~ (2³¹-1),即 -2147483648 ~ 2147483647

long:64位,值范围:-2⁶³ ~ (2⁶³-1),即 -9223372036854775808 ~ 9223372036854775807


整型的隐式转换

编译时的整型字面常量(int类型),如果将其赋值给比 int 类型低的变量类型(byte、short或char),而整型字面常量的值没有超过该变量类型的取值范围,那么编译器就可以做隐式类型转换。

byte b = 1; // 隐式类型转换,byte值范围为:-128 ~ 127,1在此范围内 
char c = 1; // 隐式类型转换,char能表示的数值范围为:0 ~ 65535,1在此范围内
short s = 1; // 隐式类型转换,short值范围为:-32768 ~ 32767,1在此范围内

编译错误
byte b1 = 128; // 编译错误,128超过了byte值范围,产生编译错误

int i = 1;
以下产生编译错误,i不是整型字面常量,不能做隐式转换,必须显式强转
byte b2 = i; // 编译错误,必须显式强转:byte b2 = (byte) i;
char c2 = i; // 编译错误,必须显式强转:char c2 = (char) i;
short s2 = i; // 编译错误,必须显式强转:short s2 = (short) i;

隐式转换的条件总结:

  • 整型字面常量
  • 整型字面常量的值没有超过要转类型的取值范围
  • 只适用对变量赋值,不适用于方法调用语句

整型之间的转换

1. char类型转换为byte、short时,必须使用显式类型转换

char类型是无符号类型,值范围是:0 ~ 65535,与byte(-128 ~ 127),short(-32768 ~ 32767)类型不存在子集关系,因此char类型与其他两种类型之间的转换必须使用显式类型转换。

char c = 'a';
byte b = (byte) c;
short s = (short) c;

2. 当byte,char或者short类型(或为三者的混合)参与运算时,结果为int类型,而并非与较高的类型相同

byte b = 100;
char c = 50;
short s = 200;
int t1 = b + c; // byte类型 + char类型,结果为int类型
int t2 = b + s; // byte类型 + short类型,结果为int类型
int t3 = c + s; // char类型 + short类型,结果为int类型

3. byte转char比较特殊,先将byte扩展到int,然后再收缩到char,即扩展收缩转换

<1> 扩展转换:

在整型数据间的扩展转换中,如果操作数是char类型(无符号类型),则进行无符号扩展,扩展位为0 如果操作数是byte、short或int(有符号类型),则进行有符号扩展,扩展位为该变量的符号位。

<2> 收缩转换:

整型数据之间的收缩转换,仅仅是截断并丢弃高位,不做任何其他处理。