bash外壳的算术评估能力设置了限制。该手册简明扼要地介绍了 shell 算术的这一方面,但指出:
评估是在固定宽度的整数中完成的,不检查溢出,但除以 0 会被捕获并标记为错误。运算符及其优先级、结合性和值与 C 语言中的相同。
这指的是哪个固定宽度整数实际上是关于使用哪种数据类型(以及为什么会这样的细节超出此范围),但极限值/usr/include/limits.h以这种方式表示:
# if __WORDSIZE == 64
# define ULONG_MAX 18446744073709551615UL
# ifdef __USE_ISOC99
# define LLONG_MAX 9223372036854775807LL
# define ULLONG_MAX 18446744073709551615ULL
Run Code Online (Sandbox Code Playgroud)
一旦你知道了这一点,你就可以像这样确认这个事实状态:
# getconf -a | grep 'long'
LONG_BIT 64
ULONG_MAX 18446744073709551615
Run Code Online (Sandbox Code Playgroud)
这是一个64 位整数,它在算术评估的上下文中直接在 shell 中转换:
# echo $(((2**63)-1)); echo $((2**63)); echo $(((2**63)+1)); echo $((2**64))
9223372036854775807 //the practical usable limit for your everyday use
-9223372036854775808 //you're that much "away" from 2^64
-9223372036854775807
0 …Run Code Online (Sandbox Code Playgroud)