为什么bash中的两个> 62的幂输出负值或为零?

时间:2013-06-13 07:12:17

标签: bash

如果我在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会以某种方式表现吗?

1 个答案:

答案 0 :(得分:4)

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

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

Python提供了比bash更好的大数字处理。

$ python -c 'print 2**256'
115792089237316195423570985008687907853269984665640564039457584007913129639936