案例 1) 较小容量的变量被分配给另一个容量较大的变量。
Java Variables and Data Types
此过程是自动的,非显式的过程称为转换
案例 2) 将容量较大的变量分配给容量较小的另一个变量
Java Variables and Data Types
在这种情况下,必须显式指定类型转换运算符。此过程称为类型转换。
如果未指定类型转换运算符;编译器给出错误。由于此规则是由编译器强制执行的,因此它使程序员意识到他将要进行的转换可能会导致一些数据丢失并防止意外丢失。
将以下代码输入到编译器
class Demo {
public static void main(String args[]) {
byte x;
int a = 270;
double b = 128.128;
System.out.println("int converted to byte");
x = (byte) a;
System.out.println("a and x " + a + " " + x);
System.out.println("double converted to int");
a = (int) b;
System.out.println("b and a " + b + " " + a);
System.out.println("\ndouble converted to byte");
x = (byte)b;
System.out.println("b and x " + b + " " + x);
}
}
会输出
int converted to byte
a and x 270 14
double converted to int
b and a 128.128 128
double converted to byte
b and x 128.128 -128
那么为什么int类型的270为什么转换成byte类型变成了14?
在Java中,将一个大范围的整数类型(如int)强制转换为较小范围的整数类型(如byte)时,可能导致溢出。这是因为byte的取值范围是从 -128 到 127。当将一个大于127的整数转换为byte类型时,会发生溢出。
代码中,将int类型的270转换为byte类型,因为270超出了byte的范围,所以发生了溢出。Java中的整数溢出会导致结果循环到该类型的范围内。
具体来说,270 % 256 的结果是 14,因为当你将270除以256时,商是1,余数是14。所以,在将270转换为byte时,实际上是将余数14赋给了变量x。
再看下面的代码
class Simple{
public static void main(String[] args){
byte a=10;
byte b=10;
//byte c=a+b;//Compile Time Error: because a+b=20 will be int
byte c=(byte)(a+b);
System.out.println(c);
}}
若不屏蔽掉那一行,编译器就会报错,这是为什么呢?原来是在Java中,对两个byte、short 或 char 类型进行算术运算时,结果会自动提升为 int 类型。这是为了防止溢出,因为 byte、short 和 char 类型的取值范围相对较小,而在执行算术运算时可能导致溢出。