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走在正确的轨道上,但解释比这更复杂。
-
通常,
int
值表达式不能在没有强制转换的情况下分配给byte
变量。 -
当
int
值表达式是常量表达式时,当表达式的值在byte
的范围内时进行AND运算,则允许在不进行强制转换的情况下对byte
变量进行赋值。但是,这仅适用于赋值上下文,并且仅适用于满足JLS定义的常量表达式。
在您的示例中,整数文本都是常量表达式,但前两个不在byte
无损赋值所需的范围内;即-128至+127。