我尝试执行以下代码:
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时,integer和short如何工作?
发布于 2012-12-30 16:22:14
当您将int和short相加时,resut是一个int,它是4个字节。
但是当你把它转换成一个短整型时,你就是从整型的最后两个字节做了一个短整型。
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发布于 2012-12-30 16:21:30
长版本:http://docs.oracle.com/javase/specs/jls/se7/html/jls-5.html
简写版本: Java获取int的16个最低有效位,并以相同的顺序将它们放入短位。
发布于 2012-12-30 16:18:46
short是2字节整数。java类型不能像在C中那样是“无符号的”。所以,最大值是32767。(Short.MAX_VALUE)。
如您所见,您尝试将更大的值赋给此变量:
123456
32767这样的值的二进制表示是您发布的负值。顺便说一句,同样的事情也发生在C中。
https://stackoverflow.com/questions/14089269
复制相似问题