当我执行下面的代码时,我得到了-7615。 任何人都可以解释我是怎么做的。
public static void main(String[] args)
{
short s = 1;
int z=123456;
s+=z;
System.out.println(s);
}
答案 0 :(得分:2)
short
无法代表值123457,因此您将获得溢出。
11110001001000001
,即17位,因为short只能存储16位,所以该值将被截断为1110001001000001
。第一位代表符号,即因为它是1
你有一个负数,并且由于负数存储在2的补码中1110001001000001
代表-7615的值(正7615将是二进制001110110111111
,它是负{76}的110001001000001
的两个补码。
答案 1 :(得分:2)
来自Primitive Data Types和JLS 5.1.3. Narrowing Primitive Conversion
短:短数据类型是16位带符号的二进制补码整数。它的最小值为-32,768,最大值为32,767(含)。与字节一样,相同的准则也适用:在内存节省实际上很重要的情况下,您可以使用short来节省大型阵列中的内存。
int z=123456;
s+=z;
与
相同 s = (short)(123456 + 1) ;
有符号整数到整数类型T的缩小转换只会丢弃除n个最低位之外的所有位,其中n是用于表示类型T的位数。除了可能丢失有关幅度的信息之外数值,这可能导致结果值的符号与输入值的符号不同。
所以123457 = 11110001001000001
Short可以表示为16位= 1110001001000001,这是负数,因为它以1
所以要存储-ve number将其转换为两个补码
1110001001000001 = 2'补充-7615.