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

Max*_*wer 24 script bash shell

我很好奇当 bash 中的数字变量在没有故意停止的情况下递增时会发生什么。这个数字能有多大?它会溢出并变成负数并永远继续增加吗?它会在某个时候破裂并滑行停止吗?

我正在使用 x86_64 AMD 处理器,但我也很乐意听到 32 位的答案,只需指定您在谈论哪个。我正在运行 Fedora21 64 位。

我已经搜索了很远很远的地方,但由于某些奇怪的原因还没有找到这个特定的花絮。似乎这将是所有手册等中的基本信息。

Spi*_*iff 27

这可能取决于您的 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 达尔文内核版本 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)-release (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