bash shell数字变量的最大值是多少?


16

我很好奇bash中的数字变量在没有故意停止的情况下递增时会发生什么。这个数字可以多大?它会溢出并变为负数,并且会一直持续增加吗?它会断裂并滑到某个位置吗?

我使用的是x86_64 AMD处理器,但也很高兴听到32位答案,只需指定您正在谈论的内容即可。我正在运行Fedora21 64位。

我到处搜寻Google,但出于某种奇怪的原因却没有找到这个特定的花絮。在所有手册等中,这似乎都是一条基本信息。


3
如何打印一些2的幂作为入门:for i in {0..70}; do echo 2 to the power of $i = $((2**i)); done
mpy

1
如果要大数,可以切换到ksh浮点运算而不是整数bashksh -c 'echo $((2**1023))'8.98846567431157954e+307
jlliagre

如果需要平流层中的浮点数或值,我会牢记ksh,浮点数会很有用。但这只是为了让我知道系统的限制,而不是因为我需要超出其限制。我将按照mpy的建议进行操作,因为我不希望引起系统崩溃的风险,所以我从头开始。
Max Power

Answers:


21

它可能取决于您的bash版本,操作系统和CPU体系结构。你为什么不自己尝试呢?将变量设置为(2 ^ 31)-1,然后将其递增,将其设置为2 ^ 32,然后将其递增,将其设置为2 ^ 64,然后递增,依此类推。

在这里,我只是在运行OS X“ El Capitan” v10.11.3的Core i7 Mac上自己尝试过,看起来bash正在使用带符号的64位整数。

$ uname -a
Darwin Spiff.local 15.3.0 Darwin Kernel版本15.3.0:2015年12月10日星期四18:40:58 PST;根目录:xnu-3248.30.4〜1 / RELEASE_X86_64 x86_64
$ bash --version
bash --version
GNU bash版本3.2.57(1)-发行版(x86_64-apple-darwin15)
版权所有(C)2007 Free Software Foundation,Inc.
$
$((X = 2 ** 16)); 回声$ X
65536 <-好的,至少是UInt16
$((X = 2 ** 32)); 回声$ X
4294967296 <-好的,至少是UInt32
$((X = 2 ** 64)); 回声$ X
0 <-哎呀,不是UInt64
$((X =(2 ** 63)-1)); 回声$ X
9223372036854775807 <-好的,至少是SInt64
$((X ++)); 回声$ X
-9223372036854775808 <-溢出并包裹为负。必须为SInt64

3

我建立了一个循环。while return status is 0 increment a variable with addition and print the variable to stdout 我在2 ^ 31以下启动它,让它顺利通过2 ^ 31和2 ^ 32并停止它,然后将初始值设置为2 ^ 63以下。结果是它无缝地从9.22e18滚动到-9.22e18,并继续增加。(向零)

只是为了检查我while [ $? -eq 0 ]是否确实在while循环中使用了命令的退出状态,而不是在使用上一个脚本的退出状态或某些奇怪情况,我还在循环中使用了一个额外的命令来运行它,以创建非零退出状态以特定的增量。

因此已签名,它将滚动而不是停止在最大值上,并且这样做没有任何错误消息。因此有可能最终陷入真正的无限循环。它不会将64位硬件和64位linux操作系统限制为旧的16或32位标准。


1

bash使用64位整数。因此,如果在变量达到最大数量后增加,变量将溢出。下面是我对无符号整数和有符号整数的测试。

MAX_UINT = 18446744073709551615
MAX_INT = 9223372036854775807

$ printf "%llu\n" $((2**64))
0
$ printf "%llu\n" $((2**64-1))
18446744073709551615

$ printf "%lld\n" $((2**63-1))
9223372036854775807
$ printf "%lld\n" $((2**63))
-9223372036854775808
$ printf "%lld\n" $((2**64-1))
-1

2
请添加一些文字,说明这是如何回答问题的。看来您正在尝试通过代码演示上限-您能否解释为什么此代码将达到所需的结果?
阿德莱德爵士
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.