2

如果我在 bash(4.0.33(0)-release) 中使用大于 62 的整数作为 2 的幂,则会发生以下情况:

$ time echo $((2**60))
1152921504606846976

real    0m0.000s
user    0m0.000s
sys 0m0.000s
$ time echo $((2**61))
2305843009213693952

real    0m0.000s
user    0m0.000s
sys 0m0.000s
$ time echo $((2**62))
4611686018427387904

real    0m0.000s
user    0m0.000s
sys 0m0.000s
$ time echo $((2**63))
-9223372036854775808

real    0m0.000s
user    0m0.000s
sys 0m0.000s
$ time echo $((2**64))
0

real    0m0.000s
user    0m0.000s
sys 0m0.000s
$ time echo $((2**65))
0

real    0m0.000s
user    0m0.000s
sys 0m0.000s
$

我猜这与二进制补码有关?但是,有人可以更详细地解释为什么 bash 的行为方式如此吗?

4

1 回答 1

4

正在对有符号的 64 位整数进行计算。为此

  • 2^62 在 64 位有符号整数的正范围内
  • 2^63 是最低的负 64 位有符号整数,因为它超过最高的正 2^63-1
  • 2^64 和更大的结果导致溢出并显示 0

与 bash 相比,Python 提供了更好的大数处理能力。

$ python -c 'print 2**256'
115792089237316195423570985008687907853269984665640564039457584007913129639936
于 2013-06-13T07:19:19.137 回答