初始化java字节数组:可能会丢失精度

时间:2015-02-26 16:50:21

标签: java byte

我正在使用十六进制二进制表示法初始化 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

enter image description here

1 个答案:

答案 0 :(得分:2)

  

当值接近一个字节的容量时,似乎不会自动转换为字节。

不,当值超出范围时会发生。 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。

这是重要的部分(强调我的):

  

此外,如果表达式是类型为byteshortcharint的常量表达式(第15.28节):

     
      
  • 如果变量的类型为byteshortchar,则可以使用缩小的原始转换,并且常量表达式的值可在变量的类型
  •   

您提供的示例在byte类型中无法表示,因此错误。