对于byte c = 3; // 编译正确 jvm在编译过程中,对于默认为int类型的数值时,当赋给一个比int型数值范围小的数值类型变量(在此统一称为数值类型k,k可以是byte/char/short类型),会进行判断,如果此int型数值超过数值类型k,那么会直接编译出错。因为你将一个超过了范围的数值赋给类型为k的变量,k装不下嘛,你没有进行强制类型转换,当然报错了。但是如果此int型数值尚在数值类型k范围内,jvm会自定进行一次隐式类型转换,将此int型数值转换成类型k。
2. package com.corn.testcast; public class TestCast { public static void main(String[] args) { byte p = 3; // 编译正确:int到byte编译过程中发生隐式类型转换 int a = 3; byte b = a; // a为变量,用a赋值其他变量时发生在运行期,为保证操作安全,编译就出错:cannot convert from int to byte byte c = (byte) a; // 编译正确 float d = (float) 4.0; } } 3. package com.java.accuracy; public class DataTypeDemo { public static void main(String[] args){ byte a=3,b=4,c; int d=5; c=(byte)(a+b); // c=3+4; // b=d;//编译报错 byte e=(byte) 130; /* * 130默认为int类型,在内存中占4个字节,每个字节占8位 * 所以对应的二进制为: * 00000000 00000000 00000000 10000010 * 正数:原码=反码=补码 * * 强制类型转换时,将进行截取操作: * 10000010(新补码) * * 由类型转换后得到的新补码求出原码: * 补码 1(符号位) 0000010(数值位) * 反码 1 0000001 * 原码 1 1111110 * 转换成二进制为-126 */ System.out.println(c); System.out.println(e); } }运行结果:
