嗨朋友们。我是java的新手,我试图打印
的值int z=123456;
System.out.println((short)z);
并且o / p即将到来:-7616
有人可以向我解释为什么会这样吗? 提前致谢;
答案 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