int类型强转为short类型会发生什么?

  • Post author:
  • Post category:其他




代码

首先来看下面一段代码,将一个数强转为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。

如果不明白或者有疑问的话欢迎在下方留言或者私聊我,大家可以一起交流交流。



版权声明:本文为qq_18367843原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。