Java中从int到byte的显式转换

我试图将int转换为byte。

int i = 128; byte b = (byte) i; 

我知道-128到127的字节范围以及将整数存储到一个字节的规则是:

byte_value = int_vale%byte_Range; (我发现在完整参考Java中)

当我将它应用于int 128时,它应该是这样的:

byte_value = 128%256 = 128;

但是,它实际上是:-128

我无法理解这背后的实际逻辑。 请帮忙!!

逻辑很简单,Java数字总是用二进制补码。

现在一个字节有8位,128是10000000 。 当你这样做

 int i = 128 

你最终得到:

 i == 00000000 00000000 00000000 10000000 

当你把它强制转换为一个字节时,你最有意义的那个被截断了,所以你最终得到了

 b == 10000000 

但Java byte已签名,128无法表示,因为它溢出并包裹。 所以会发生的是,该值最终为128 - 256 = -128 (这是因为两个补码)。

转换为byte并不意味着int_value % byte_range 。 这意味着只有最后8位有效位保留在byte值中。 起初,这似乎意味着相同的事情,但byte s签署。

int128是以下位:

 00000000 00000000 00000000 10000000 

保留最后8位时,结果如下:

 10000000 

现在, byte最重要的位被解释为-128,而不是像int那样的+128。

128溢出一个byte ,结果为负,因为设置了最高有效位。

您只需使用以下方法:

 byteValue() 

这将以整数forms返回此Integer的值。

您需要导入Java.lang或将其输入为:

 Java.lang.Integer.byteValue() 

字节在Java中被视为有符号值; 就像你指出的那样,一个字节的范围是[-128,127]。 添加1到127会翻转符号位,这意味着127 + 1 = -128。