cod*_*boy 1 java type-conversion
我最近开始学习Java,不能仅仅理解语言的一种功能。
当我在下面编写代码时,不会出现任何错误(并且明智地,我不会!):
byte b = 10 * 2
Run Code Online (Sandbox Code Playgroud)
但是,当我键入以下代码时,编译器将引发错误:
int i = 10;
byte b = i * 2
Run Code Online (Sandbox Code Playgroud)
当编译器可以执行检查10 * 2以确保它小于的范围时byte,为什么它也不能执行检查以i * 2查看它是否小于的范围byte?
它与位的低层表示有关,还是与内存有关?
在Java中,每当您尝试执行算术表达式时,如果表达式包含任何类型的变量,Java都会将该表达式的所有元素转换为该表达式中可用的最高数据类型。
因此,
当您执行10 * 2时,两个操作数都是文字,不是变量,因此不会自动提升操作数和结果的数据类型,除非结果超出了数据类型的范围(这里是字节,且20完全在字节范围内。
但是,当您执行i * 2时,Expression由变量组成,其中i是int,结果为20。但是,其类型将为int。因为操作数被自动提升为int,也就是说在计算表达式时将20提升为int,因为两个操作数均为int,结果将为int。而且int不能存储在字节中,即使它在其范围内。因为编译器会认为,如果将int存储在一个字节中,则会损失值。
因此,在这种情况下,您必须强制将其强制转换为字节。
byte b = (byte)(i*2);
Run Code Online (Sandbox Code Playgroud)
尝试运行此命令,您会感到惊讶:
byte b = 10;
b = b * 2;
Run Code Online (Sandbox Code Playgroud)
对此的解释仍与上述相同。