这是我的Example
代码
class Example{
public static void main(String args[]){
short s = 100;
byte b = s; // this is compile time error because of no casting
byte z = (short)25.12; // why this happens
System.out.println(z);
System.out.println(((Object)z).getClass());
}
}
请原谅我,因为我刚刚开始学习java。你能在技术上告诉我这个问题吗?
发布于 2019-11-18 00:09:26
byte b = s;
会给出错误,因为你不能将较大的数据类型(2字节)赋给较小的数据类型(1字节)。这就是为什么它会给你编译时错误的原因,,
byte z = (short)25.12;
,现在到这一行,让我们来分析一下。默认情况下,25.2
是双,但是当您使用(short)对其进行类型转换时,它变成了25
,这是一个整数文字。现在编译器将检查25是否可以存储在字节中。由于5
在-128和127之间,也就是字节的范围,所以它不会产生任何编译时错误。但是如果你给出的值超出了字节的范围,它就会给出错误。例如:byte z = (short)128.12;
发布于 2019-11-18 00:23:02
编译器不会运行源代码,也不会分析其逻辑。编译器只是从源代码的每一行创建字节码。
当编译器看到byte b = s;
时,它只会尝试生成赋值为b
的代码。它不会回顾您的代码来查看哪些其他指令可能影响了s
的值。
它只知道在该行代码中,您正在尝试将一个8位值(一个字节)设置为一个未知的16位值(短值)。当编译器查看这行代码时,它不考虑前面的任何行,因此它不关心先前的赋值;它将s
视为一个未知的16位值。这个未知值可能是也可能不是适合8位的值。
另一方面,byte z = (short)25.12;
是安全的,因为编译器不需要查看任何其他指令就可以知道25可以适合8位。将其转换为short
并不重要。重要的是,隐式地将其转换为byte
不会丢失任何信息。
对于(int) 25
来说也是如此。在所有情况下,25将适合8位,而不会丢失信息。
发布于 2019-11-17 22:47:32
将较大的数据类型转换为较小的数据类型并不是隐式的,因为它可能导致不正确的转换(数据丢失)。
byte b = s;
这就是为什么上面的代码行不能编译,因为s的类型是short (2字节),而b的类型是byte (1字节)。因此,您需要显式地对其进行类型转换
byte b = (byte)s;
https://stackoverflow.com/questions/58901397
复制相似问题