为什么在Java中将十六进制数转换为字节无法正常工作?

3

"byte FOO = 0xFE;"在Java中无法使用。

"Cannot convert from into to byte",但在C++中可以正常工作。如何解决?


3
一个好的步骤是停止将Java编程看作C++。在Java中编译结果是否与C++相同并不重要,重要的是将你的想法转换为Java代码。 - GManNickG
2个回答

8

数值0xFE等同于int中的254,不在字节范围内,因此如果您尝试将其存储在字节中,则不会进行隐式类型转换。 您的RHS值必须在[-128至127]范围内才能容纳在字节中。

或者,您可以通过显式类型转换告诉编译器将其存储:

byte FOO = (byte)0xFE;

然而,如果您存储的值可以适配于byte范围内,则不需要进行显式类型转换。
byte FOO = 0x20;  // OK, can accommodate in byte.

请参阅JLS - 第5.1节以获取有关类型转换的更多详细信息。

还有JLS - 第5.2节,其中专门讨论赋值转换

引用自JLS的一句话:-

如果变量的类型为byte、short或char,并且常量表达式的值可以表示为变量的类型,则可以使用缩小的原始类型转换。


2

Either:

long FOO = 0xFE; //Use long as type

或者
byte FOO = (byte)0xFE; //Typecast to byte.

通过使用十六进制数,编译器将确定该值是否适合字节范围[-128,127]。由于0xFE大于127,因此您必须使用int或long,因为它超出了byte的范围。
你的例子被称为缩小转换

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接