代码
首先来看下面一段代码,将一个数强转为short型
public static void main(String[] args) {
short num = 32767;
short num1 = 1;
short result = (short) (num + num1);
System.out.println(result);
}
这里考察的知识点为short类型的取值范围。
过程
在Java语言里short类型占2个字节,最大值为2
15-1(2的15次方减一),即32767,最小值为-2
15,即-32768。
在上面代码中:num+num1的结果会提升为int型,即32768,已经超过了short类型的最大值,当强转为short型时,会丢掉精度。
下面来看一下int类型强转成short类型的过程:
short类型32767的二进制表示为:
01111111 11111111
int类型32768的二进制表示为
00000000 00000000 10000000 00000000
int类型转为short类型的方式为:高16位 丢失,只保留和short类型相同位,
最终结果就是:
10000000 00000000
结果
正常来说我们认为该数值应该是-0;因为最高位为符号位,所以该数实际上表示的是-0,由于计算机在存储的时候实际上是按补码来存储的,所以按照负数求补码的逻辑则为,正数原码取反加1,-0的正数则为+0,二进制表示为
00000000 00000000
取反:
11111111 11111111
加1:
(1)00000000 00000000
注意:(1)已经超过了16位长度,会被舍弃掉。
所以正0和负0在计算机中的补码是一模一样的,而实际上,16位二进制数可以表现2^16个编码,但由于+0和-0的补码只有一个,这就造成了还有一个编码那就是10000000 00000000这个编码没有用来表示任何数,所以就人为规定了该编码表示的数为-32768.
所以打印的结果为-32768。
如果不明白或者有疑问的话欢迎在下方留言或者私聊我,大家可以一起交流交流。