Java中从int到byte的显式转换

时间:2015-02-05 18:58:45

标签: java type-conversion

我正在尝试将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

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

4 个答案:

答案 0 :(得分:5)

投靠byte并不代表int_value % byte_range。这意味着只有最后8位有效位保存在byte值中。起初,这似乎意味着相同的事情,但byte已签署。

int128如下:

00000000 00000000 00000000 10000000

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

10000000

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

128溢出byte,结果为负,因为设置了最重要的位。

答案 1 :(得分:1)

逻辑很简单,Java编号总是用两个补码签名。

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

int i = 128

你最终得到:

i == 00000000 00000000 00000000 10000000

当你把它投射到一个字节时,你最有意义的24个被截断,所以你最终得到了

b == 10000000

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

答案 2 :(得分:0)

您只需使用以下方法:

byteValue()

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

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

Java.lang.Integer.byteValue() 

答案 3 :(得分:0)

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