在Java中溢出Short

Sco*_*ade 3 java short primitive-types

我有一个关于shortJava中数据类型的问题.我知道短期的范围在-32768到32767之间.

因此,如果我尝试添加两个超出范围的短值,则结果最终为假定的总减去正范围或负范围乘以2,如下所示:

short a = 30000;
a = (short) (a+a);
Run Code Online (Sandbox Code Playgroud)

结果是-5536.

所以数学是32768 + 32768 = 65536,6000 - 65536 = -5536.

我知道它的作用,但我不知道为什么会这样做.

任何人都可以解释逻辑或为什么Java这样做?

ysh*_*vit 7

发生了什么事情,你的电话号码正在四处传播.更具体地说,你有一个30,000,二进制是:

0111 0101 0011 0000
Run Code Online (Sandbox Code Playgroud)

当你把它添加到自己,并携带1,你得到:

1110 1010 0110 0000
Run Code Online (Sandbox Code Playgroud)

(注意:在二进制中将数字乘以2非常容易 - 只需将所有位移到左侧.)

短是使用二进制补码的有符号数,意味着最左边的1实际上是一个减号; 该数字代表-5536.

如果再次将该数字乘以2,则需要超过2个字节来表示它.由于a中的字节数不超过2个short,因此当int表达式的结果缩小为a 时,额外的位将被删除short.做到这一点,你将得到一个0作为最左边的数字; 这个数字又是正数.最后你最后会再拿一个1作为最左边的; 这个数字又是负数.最终你将所有0都转换为数字; 将任何整数乘以2足够的时间总是会得到0(具体来说,如果它是一个N位数,则乘以2 N次将总是得到0).

如果你没有缩小到a short,你仍然最终会用完int (当你需要33位或更多位时)数字 - 这会导致额外的数字被丢弃,这是整数溢出.如果任何一个参数都是a long,那么同样的事情会发生,尽管它需要65+位.