[英]Initialize java byte array: possible loss of precision
我正在使用十六进制或二进制表示法在Java中初始化一个byte[]
。
当值接近一个字节的容量时,似乎不会自动转换为字节。
解决方案是显式转换为byte
。
$ javac bitsandbytes/ByteBufferTest.java
bitsandbytes/ByteBufferTest.java:9: error: possible loss of precision
static byte[] byteArray = { 0xFF, (byte) 0xCC, 0xCC, 0b1000_0000, 0x2F, 0x01 };
^
required: byte
found: int
bitsandbytes/ByteBufferTest.java:9: error: possible loss of precision
static byte[] byteArray = { 0xFF, (byte) 0xCC, 0xCC, 0b1000_0000, 0x2F, 0x01 };
^
required: byte
found: int
bitsandbytes/ByteBufferTest.java:9: error: possible loss of precision
static byte[] byteArray = { 0xFF, (byte) 0xCC, 0xCC, 0b1000_0000, 0x2F, 0x01 };
^
required: byte
found: int
3 errors
当值接近一个字节的容量时,似乎不会自动转换为字节。
不,它在值超出范围时发生。 Java中的一个byte
在[-128,127]范围内。 所以0xcc
超出了范围,例如......虽然这与你表达文字的基数无关。
如果你有:
byte[] x = { 127 };
System.out.println(x[0]);
这将打印127,因为它在byte
范围内。 如果你有:
byte[] x = { (byte) 128 };
System.out.println(x[0]);
...将打印-128。 如果您没有明确的演员表,那将是非常意外的。
不可否认,有关“精确度”的错误消息很奇怪 - 而不是我收到的消息。 我看到了这个:
错误:不兼容的类型:可能从int到byte的有损转换
这是一个有损转换,所以没关系。 我不会谈论这是一个精确的问题,这是我期望将(例如) double
转换为float
。
就JLS而言,相关部分是5.2 ,它适用于ArrayInitializer中的每个VariableInitializer。
这是重要的部分(强调我的):
此外,如果表达式是
byte
,short
,char
或int
类型的常量表达式(第15.28节):
- 如果变量的类型是
byte
,short
或char
,则可以使用缩小的基元转换, 并且常量表达式的值可以在变量的类型中表示 。
您给出的示例在byte
类型中无法表示,因此出现错误。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.