我必须将前两个八位字节从int强制转换为byte,但不能将其他八位字节强制转换.为什么


byte[] ipAddr = new byte[] {(byte) 142, (byte) 250,68,46};

我正在了解各种java网络函数,为了编译它,我必须将前两个八位字节转换为一个字节。

否则我会得到这个错误

java: incompatible types: possible lossy conversion from int to byte

你知道为什么我必须特别铸造第一个八位字节而不是全部吗?为什么java把它当作int而不是字节?

在java中,字节是8位有符号的数据类型,因此值的范围从-128到+127。前两个值大于最大值,因此需要手动允许转换(在您的情况下,通过强制转换(。

这两个八位字节恰好大于字节中允许的最大值127(2^7-1(。任何大于127的值都必须进行强制转换(或更小心地处理(,并且由于大小差异,您将在直接强制转换中丢失数据。查看此处了解更多信息:https://docs.oracle.com/javase/tutorial/java/nutsandbolts/datatypes.html#:~:text=基元%20values%20do%20not%20share,value%20of%20127%20(含(。

@Dennis走在正确的轨道上,但解释比这更复杂。

  1. 通常,int值表达式不能在没有强制转换的情况下分配给byte变量。

  2. int值表达式是常量表达式时,当表达式的值在byte的范围内时进行AND运算,则允许在不进行强制转换的情况下对byte变量进行赋值。

    但是,这仅适用于赋值上下文,并且仅适用于满足JLS定义的常量表达式

在您的示例中,整数文本都是常量表达式,但前两个不在byte无损赋值所需的范围内;即-128至+127。

最新更新