如何在java中将int值转换为字节

时间:2014-06-01 20:47:05

标签: java

嗨朋友们。我是java的新手,我试图打印

的值
int z=123456;
System.out.println((short)z);

并且o / p即将到来:-7616

有人可以向我解释为什么会这样吗? 提前致谢;

3 个答案:

答案 0 :(得分:4)

有符号的16位整数的最大值为32767,因此如果您尝试转换较大的数字,它将溢出并变为负数,除非您再次换行。

我们考虑一下123456。如果我们计算123456 % (2^16),我们会得到57920

字节表示为0b1110001001000000,在2的补码中等于-7616

为了使它更明显,我们可以如下计算2的补码。

(0b0110001001000000 - 2^15) = -7616

答案 1 :(得分:0)

范围int: - 2,147,483,648至2,147,483,647

范围short: - 32,768到32,767

现在,当您使用值32767并添加1的短变量时,输出将为-32768。也就是说,当一些计算的结果超出范围时,它继续从另一个极端开始。这可以用二进制表示来解释。

eg. consider a number of 3 bits. Range will be -4 to 3. i.e. (100, 101, 110, 111, 000, 001, 010, 011) respectively.
So if you add 1 to 3 you would be doing: 001 + 011 = 100 which is nothing but -4.

Note: Also remember that while calculating, any extra bit(extra carry) is to be ignored.

因此,当您将123456转换为short时,输出将是假定在32767之后计数将从-32768开始生成的输出

答案 2 :(得分:0)

原因是你正在缩小原语,更多的是:http://docs.oracle.com/javase/specs/jls/se5.0/html/conversions.html#5.1.3

在这个特定情况下 123456 in base2 32位(Java中的整数(原始!)是32位)第二补码(即Java存储基元的方式):00000000000000011110001001000000

如果缩小(在这种情况下为16位的短路),则第二补码二进制表示将为:1110001001000000,即-7616