byte b = 0xFFFFFFFF; //OK, because integer -1 sits between -128 and 127, FINE!!
char ch = 0xFFFFFFFF; //Not OK, because integer -1 does not sit between 0 and 65535, FINE!!
byte b = 0L; //Compiler says Not OK? But long integer 0 sits between -128 and 127?
我不相信java编译器在上面第三行代码中应用的缩小规则。
请帮助我理解这条缩小规则背后的逻辑。
答案 0 :(得分:3)
文字L
上的0L
后缀使这个字面为long
(64位有符号整数)。
根据Java语言的规则,long
到byte
没有隐含的缩小。
请参阅Java语言规范section 5.2 Assignment Contexts:
此外,如果表达式是类型为
byte
,short
,char
或int
的常量表达式(第15.28节):
- 如果变量的类型是
byte
,short
或char
,则可以使用缩小的基元转换,并且常量表达式的值可以在类型中表示。变量
请注意,常量表达式的类型不包括long
。
答案 1 :(得分:0)
将原始数据类型转换为另一种数据类型有两种方法。明确和隐含。
您的情况byte b = 0L;
中的隐式转换会出现编译错误,因为可能会丢失信息。
如果你改变它:
byte b=(byte)0L;
然后就没有编译器错误了,因为你明确告诉编译器转换。