相关疑难解决方法(0)

bash shell 没有警告您算术溢出等的基本原理是什么?

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)

shell bash arithmetic

9
推荐指数
1
解决办法
2269
查看次数

标签 统计

arithmetic ×1

bash ×1

shell ×1