我尝试执行以下代码:
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);
}
}
输出“-7616”怎么样?当类型转换为short时,整数和short是如何工作的?
答案 0 :(得分:3)
长版: http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html
简短版本: Java获取int的16个最低有效位,并以相同的顺序将它们放入short中。
答案 1 :(得分:1)
short
是2字节整数。并且java类型不能像C中那样“无符号”。因此,最大值为32767.(Short.MAX_VALUE)。
正如您所看到的,您试图为此变量赋予更大的价值:
123456
32767
此类值的二进制表示形式为您发布的负值。顺便说一句,在C中也是如此。
答案 2 :(得分:1)
当你添加一个int和一个short时,resut是一个int,它是4个字节。
但是当你把它变成一个短片时,你会从int的最后两个字节做一个短片。
123456
的字节为0x0 0x1 0xe2 0x40
,因此您从0xe2 0x40
开始缩短。
0xe2
的第一位为1,结果短为负。
您可以使用这个简短的程序来查看会发生什么:
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
答案 3 :(得分:1)
这称为缩小原始转换。您正在尝试将int
转换为short
。
可能过于技术化但尝试理解Java Language Specification, section 5.1.3。
答案 4 :(得分:0)
short
数据类型的最大值为32,767。在这里你添加了123456与0. 123456大于short
的最大值,因此它被截断。
答案 5 :(得分:0)
明确的施法。当您将Java int转换为short时,您将获得静默截断。
答案 6 :(得分:0)
x + i
的类型为int
。此int包含的值大于short的最大值。当你把它转换为short时,32位int的16位最后一位用来做空,这16位最后一位碰巧代表负的短值。
Java语言规范说:
有符号整数到整数类型T的缩小转换只会丢弃除n个最低位之外的所有位,其中n是用于表示类型T的位数。除了可能丢失有关幅度的信息之外数值,这可能导致结果值的符号与输入值的符号不同。
答案 7 :(得分: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]