2015-02-05 88 views
0

我想将int转换为字节。从int到int的显式转换到Java中的字节

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

我知道字节的范围,如果是从-128到127,并存储到一个字节的整数的规则是:

byte_value = int_vale%byte_Range; (我发现,在完整的参考爪哇)

当我应用此为int 128应该是这样的:

byte_value = 128%256 = 128;

但是,它实际上是:-128

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

回答

1

的逻辑很简单,Java的号码补总是签署。

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

int i = 128 

你结束了:

i == 00000000 00000000 00000000 10000000 

当你将它转换为一个字节你24个最有意义的是截断,所以你最终

b == 10000000 

但一个Java byte被签名,并且128不能被表示,因为它溢出并且绕过。所以会发生什么是价值结果为128 - 256 = -128(这是因为二补)。

+0

谢谢!! ..我明白了.. – 2015-02-05 19:06:23

5

铸造到byte并不意味着int_value % byte_range。这意味着只有最后8个有效位保存在byte值中。起初,这似乎意味着同样的事情,但byte s已签署。

int128是以下位:

00000000 00000000 00000000 10000000 

当最后8位被保留,这就是结果:

10000000 

现在,在byte最显著位解释为-128,而不是+128,因为它在int中。

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

+1

+1,JLS引用是[JLS 5.1.3](http://docs.oracle.com/javase/specs/jls/se8/html/jls-5.html#jls-5.1.3): “将有符号整数缩小到整数类型T只是简单地丢弃n个最低位的所有位,其中n是用于表示类型T的位数。”这个(而不是完整的参考Java或其他)是操作如何工作的最终定义。 – yshavit 2015-02-05 19:04:53

0

您可以简单地使用下面的方法:

byteValue() 

这将返回该Integer字节的值。

你要么需要进口的java.lang或键入它作为:

Java.lang.Integer.byteValue() 
0

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