gpt4 book ai didi

java - java中的溢出短

转载 作者:搜寻专家 更新时间:2023-11-01 04:03:13 25 4
gpt4 key购买 nike

我有一个关于 Java 中的 short 数据类型的问题。我知道 short 的范围在 -32768 到 32767 之间。

因此,如果我尝试将两个超出范围的短值相加,结果最终是假设的总和减去正值范围或负值范围乘以 2,如下所示:

short a = 30000;
a = (short) (a+a);

结果是-5536

所以数学是32768 + 32768 = 655366000 - 65536 = -5536

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

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

最佳答案

发生的情况是您的电话号码正在环绕。更具体地说,你有一个数字 30,000,它的二进制形式是:

0111 0101 0011 0000

当你将它与自身相加并进位 1 时,你会得到:

1110 1010 0110 0000

(注意:将二进制数乘以 2 非常容易——只需将所有位向左移动一位即可。)

short 是使用 two's complement 签名的数字,这意味着最左边的 1 实际上是一个负号;该数字代表 -5536。

如果您将该数字再次乘以 2,则需要超过 2 个字节来表示它。由于 short 中的字节数不超过 2 个,因此当表达式的 int 结果缩小为 short 时,多余的位将被丢弃。这样做足够了,最左边的数字将是 0;数字再次为正。然后最终您将再次获得 1 作为最左边的;这个数字又是负数。最终你会把所有的 0 都移到数字中;将任何整数乘以 2 足够多的次数将始终得到 0(具体而言,如果它是 N 位数字,将其乘以 2 N 次将始终得到 0)。

如果您没有缩小到 short,您最终还是会用完 int 中的数字(当您需要 33 位或更多位时)——这将导致多余的数字被丢弃,即 integer overflow .如果任一参数是 long,也会发生同样的事情,尽管它需要 65 位以上。

关于java - java中的溢出短,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/11990681/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com