正在发生的事情是你的号码正在环绕。更具体地说,你有一个数字 30,000,二进制是:
0111 0101 0011 0000
当您将其添加到自身并携带 1 时,您会得到:
1110 1010 0110 0000
(注意:在二进制中将一个数字乘以 2 非常容易——只需将所有位向左移动一位。)
short 是使用二进制补码的有符号数,这意味着最左边的 1 实际上是减号;该数字代表-5536。
如果再次将该数字乘以 2,则需要 2 个以上的字节来表示它。由于 a 中没有超过 2 个字节,因此当表达式的结果缩小到 ashort
时,多余的位就会被丢弃。做到这一点,你会得到一个 0 作为最左边的数字;该数字再次为正。然后最终您将再次将 1 作为最左边;这个数字又是负数了。最终你会将所有的 0 移到数字中;将任何整数乘以 2 足够的次数总是会得到 0(具体来说,如果它是一个 N 位数,那么将它乘以 2 N 次总是会得到 0)。int
short
如果您没有缩小到 a short
,您最终仍然会用完 in 中的数字int
(当您需要 33 位或更多位时)——这将导致多余的数字被丢弃,即整数溢出。如果任何一个参数都是 a ,也会发生同样的事情long
,尽管它需要 65+ 位。