java的类型转换问题。int a = 123456;short b = (short)a;System.out.println(b);为什么结果是-7616?

2024-11-27 14:49:14
推荐回答(5个)
回答1:

这个从二进制来解释:

int 是 32 位,也就是最多能表示长度为 32 位的二进制整数。第一位是符号位,表示正负,0 表示正的,1 表示负的。当首位为 1(为负)时,把所有的位取反(0 变成 1,1 变成 0),然后再 + 1,就是它的正数相反数。

short 是 16 位,长度短了,其他和 int 一样的。

然后看你的问题,123456 本来是 int,有 32 位,二进制表示为:0000 0000 0000 0001 1110 0010 0100 0000。

然后你转成了 short,short 最大 16 位,截取最后 16 位,就是 1110 0010 0100 0000,这个数肯定不是原来那个数了,首位是 1,那么就是负数,取反加一以后是 0001 1101 1100 0000,这转成十进制就是 7616,这是相反数,所以是 -7616。

看明白了吗?不明白问我。

回答2:

因为short的最大值并不能容纳123456这个数,所以溢出了!才得到了-7616这个数。
在java中,short占用2个字节
它的取值范围是:-65536-65535
最大值小于123456,那么这个时候,数据会溢出!
溢出之后的计算数值方式很简单,具体就不给你计算了!给你一个计算方法!
如果这个数是65536那么强制转换成short之后得到的值是-65536
如果这个数是-65537那么强制转换成short之后得到的值是65535

回答3:

public static void main(String[] args) {
int a = 123456;
String binary=Integer.toBinaryString(a);
System.out.println(a+"的二进制位:"+binary);
//进行short强制转换的话,取后面的二个字节(后16位)
String last16bit=binary.substring(binary.length()-16);
System.out.println(a+"二进制的后16位为:"+last16bit);
/**把上面得到的16位二进制转换为short值,最高位为符号位,0代表正数,1代表负数,后15位为数值位
* 由于最高位为1,表示这个short为负数,后15位应该为补码
* (short)a为上面15位的补码,即,1110001001000000的补码为0001110110111111
**/
short b的绝对值=Short.parseShort("0001110110111111",2);
//由于为负数需要附加符号位
System.out.println(-b的绝对值);
System.out.println("或者使用如下方法计算");
short short_max=Short.MAX_VALUE;
System.out.println("最大short为:"+short_max);
short b=(short) (Short.parseShort(last16bit.substring(1),2)-short_max);
System.out.println(b);

}

回答4:

楼上的兄弟说得极是。。short不能表示那么大的数。所以就这样了。。专业术语叫数据溢出。

回答5:

所以在类型的转换时一定要注意数据类型的取值范围