1

I tried executing the below code :

public class Test5 {

/**
 * @param args
 */
public static void main(String[] args) {
    short x = 0;
    int i = 123456;


    x = (short) (x + i);
    System.out.println(x);
}

}

How is the output "-7616"? how does integer and short work when type casted to short?

4

8 回答 8

3

长版: http ://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html

短版:Java 采用 int 的 16 个最低有效位,并将它们以相同的顺序放入 short 中。

于 2012-12-30T08:21:30.330 回答
1

short是 2 字节整数。并且 java 类型不能像 C 中那样是“无符号”的。因此,最大值是 32767。(Short.MAX_VALUE)。

如您所见,您试图为该变量赋予更大的价值:

123456
 32767

这种值的二进制表示是您发布的负值。顺便说一句,同样的情况发生在 C 中。

于 2012-12-30T08:18:45.907 回答
1

当你添加一个 int 和一个 short 时,resut 是一个 int,即 4 个字节。

但是当你把它转换成一个short时,你是从int的最后两个字节做一个short。

123456的字节是0x0 0x1 0xe2 0x40,因此您正在缩短 from 0xe2 0x40

第一点0xe21,产生的短路为负。

你可以玩这个简短的程序来看看会发生什么:

int i = 123456; // <== change the value
System.out.format("Bytes of %d: ", i);
byte[] bytes = ByteBuffer.allocate(4).putInt(i).array();
for (byte b : bytes) {
   System.out.format("0x%x ", b);
}
System.out.format("\nlast two bytes : %d*256 + %d = %d\n", bytes[2], bytes[3], (short)(bytes[2]*256 + bytes[3]));

输出 :

Bytes of 123456: 0x0 0x1 0xe2 0x40 
Last two bytes : -30*256 + 64 = -7616
于 2012-12-30T08:22:13.533 回答
1

这就是所谓的缩小原始转换。您正在尝试转换intshort.

它可能技术性太强,但请尝试理解Java 语言规范,第 5.1.3 节

于 2012-12-30T08:22:53.353 回答
0

显式铸造。当您将 Java int 转换为 short 时,您将获得静默截断。

于 2012-12-30T08:22:03.267 回答
0

的类型x + iint。此 int 包含一个大于 short 最大值的值。当您将其转换为 short 时,将采用 32 位 int 的最后 16 位来制作 short,而这 16 位恰好代表一个负的 short 值。

Java 语言规范说:

有符号整数到整数类型 T 的窄化转换只会丢弃除 n 个最低位之外的所有位,其中 n 是用于表示类型 T 的位数。除了可能丢失有关数值大小的信息之外,这可能会导致结果值的符号与输入值的符号不同。

于 2012-12-30T08:22:12.030 回答
0

数据类型的最大值short为 32,767。在这里你添加了 123456 和 0。123456 大于 的最大值short,所以它被截断。

于 2012-12-30T08:15:28.317 回答
0

或者看看这段代码,运行它。举个例子应该更容易理解。

public class Test {
    public static void main(String args[]) throws Exception {
        short v = 32767;
        System.out.println(v);
        v += 1;
        System.out.println(v);
        v += 1;
        System.out.println(v);

        System.out.println();

        v = 0;
        for (int i = 0; i < 123; i++) {
            int intVal = i * 1000;
            v = (short) intVal;
            System.out.println("intVal[" + intVal + "] shortVal[" + v + "]");
        }
    }
}

输出...

32767
-32768
-32767

intVal[0] shortVal[0]
intVal[1000] shortVal[1000]
intVal[2000] shortVal[2000]
intVal[3000] shortVal[3000]
intVal[4000] shortVal[4000]
intVal[5000] shortVal[5000]
intVal[6000] shortVal[6000]
intVal[7000] shortVal[7000]
intVal[8000] shortVal[8000]
intVal[9000] shortVal[9000]
intVal[10000] shortVal[10000]
intVal[11000] shortVal[11000]
intVal[12000] shortVal[12000]
intVal[13000] shortVal[13000]
intVal[14000] shortVal[14000]
intVal[15000] shortVal[15000]
intVal[16000] shortVal[16000]
intVal[17000] shortVal[17000]
intVal[18000] shortVal[18000]
intVal[19000] shortVal[19000]
intVal[20000] shortVal[20000]
intVal[21000] shortVal[21000]
intVal[22000] shortVal[22000]
intVal[23000] shortVal[23000]
intVal[24000] shortVal[24000]
intVal[25000] shortVal[25000]
intVal[26000] shortVal[26000]
intVal[27000] shortVal[27000]
intVal[28000] shortVal[28000]
intVal[29000] shortVal[29000]
intVal[30000] shortVal[30000]
intVal[31000] shortVal[31000]
intVal[32000] shortVal[32000]
intVal[33000] shortVal[-32536]
intVal[34000] shortVal[-31536]
intVal[35000] shortVal[-30536]
intVal[36000] shortVal[-29536]
intVal[37000] shortVal[-28536]
intVal[38000] shortVal[-27536]
intVal[39000] shortVal[-26536]
intVal[40000] shortVal[-25536]
intVal[41000] shortVal[-24536]
intVal[42000] shortVal[-23536]
intVal[43000] shortVal[-22536]
intVal[44000] shortVal[-21536]
intVal[45000] shortVal[-20536]
intVal[46000] shortVal[-19536]
intVal[47000] shortVal[-18536]
intVal[48000] shortVal[-17536]
intVal[49000] shortVal[-16536]
intVal[50000] shortVal[-15536]
intVal[51000] shortVal[-14536]
intVal[52000] shortVal[-13536]
intVal[53000] shortVal[-12536]
intVal[54000] shortVal[-11536]
intVal[55000] shortVal[-10536]
intVal[56000] shortVal[-9536]
intVal[57000] shortVal[-8536]
intVal[58000] shortVal[-7536]
intVal[59000] shortVal[-6536]
intVal[60000] shortVal[-5536]
intVal[61000] shortVal[-4536]
intVal[62000] shortVal[-3536]
intVal[63000] shortVal[-2536]
intVal[64000] shortVal[-1536]
intVal[65000] shortVal[-536]
intVal[66000] shortVal[464]
intVal[67000] shortVal[1464]
intVal[68000] shortVal[2464]
intVal[69000] shortVal[3464]
intVal[70000] shortVal[4464]
intVal[71000] shortVal[5464]
intVal[72000] shortVal[6464]
intVal[73000] shortVal[7464]
intVal[74000] shortVal[8464]
intVal[75000] shortVal[9464]
intVal[76000] shortVal[10464]
intVal[77000] shortVal[11464]
intVal[78000] shortVal[12464]
intVal[79000] shortVal[13464]
intVal[80000] shortVal[14464]
intVal[81000] shortVal[15464]
intVal[82000] shortVal[16464]
intVal[83000] shortVal[17464]
intVal[84000] shortVal[18464]
intVal[85000] shortVal[19464]
intVal[86000] shortVal[20464]
intVal[87000] shortVal[21464]
intVal[88000] shortVal[22464]
intVal[89000] shortVal[23464]
intVal[90000] shortVal[24464]
intVal[91000] shortVal[25464]
intVal[92000] shortVal[26464]
intVal[93000] shortVal[27464]
intVal[94000] shortVal[28464]
intVal[95000] shortVal[29464]
intVal[96000] shortVal[30464]
intVal[97000] shortVal[31464]
intVal[98000] shortVal[32464]
intVal[99000] shortVal[-32072]
intVal[100000] shortVal[-31072]
intVal[101000] shortVal[-30072]
intVal[102000] shortVal[-29072]
intVal[103000] shortVal[-28072]
intVal[104000] shortVal[-27072]
intVal[105000] shortVal[-26072]
intVal[106000] shortVal[-25072]
intVal[107000] shortVal[-24072]
intVal[108000] shortVal[-23072]
intVal[109000] shortVal[-22072]
intVal[110000] shortVal[-21072]
intVal[111000] shortVal[-20072]
intVal[112000] shortVal[-19072]
intVal[113000] shortVal[-18072]
intVal[114000] shortVal[-17072]
intVal[115000] shortVal[-16072]
intVal[116000] shortVal[-15072]
intVal[117000] shortVal[-14072]
intVal[118000] shortVal[-13072]
intVal[119000] shortVal[-12072]
intVal[120000] shortVal[-11072]
intVal[121000] shortVal[-10072]
intVal[122000] shortVal[-9072]
于 2012-12-30T08:24:11.567 回答