2015-10-05 25 views
-1

当我执行下面的代码时,我得到了-7615。 任何人都可以解释我如何。添加short和int值,将其存储在短变量

public static void main(String[] args) 
{ 
    short s = 1; 
    int z=123456; 
    s+=z; 
    System.out.println(s); 
} 
+1

什么是可以存储在一个简短的值的范围?如果不是-7615,你认为价值是多少? –

回答

2

Primitive Data TypesJLS 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 短片可以通过16位= 1110001001000001这是负的,因为它的启动与1

所以存储-ve数将其转换成两个互补

1110001001000001 = 2的补码表示-7615.

2

short不能表示值123457,因此你会得到溢出。

123457二进制将是11110001001000001即17位,并且因为short只能存储16位,所以该值将被截断为1110001001000001。第一位代表符号,即因为它是1你有一个负数,并且因为负数存储在2的补码1110001001000001表示-7615的值(正7615将是二进制001110110111111这是负数7615的二进制补码110001001000001) 。