Bash执行大整数加法得到异常负数结果是什么原因?
Bash整数求和结果异常原因分析
这个问题的核心是Bash默认使用有符号64位整型执行算术运算,你预期的无符号64位溢出临界值和Bash实际的运算规则不匹配,具体说明如下:
- 首先明确两类64位整型的取值范围差异:
- 有符号64位整型(Bash默认使用的类型)的取值范围是
-9223372036854775808到9223372036854775807,也就是-2^63到2^63 - 1,溢出时会按补码规则执行模2^64的环绕处理 - 你提到的临界值
18446744073709551616是2^64,属于无符号64位整型的溢出临界值,不符合Bash算术运算的默认规则
- 有符号64位整型(Bash默认使用的类型)的取值范围是
- 你的运算结果完全符合有符号64位整型溢出逻辑:
你参与运算的数值27989065672496370937本身已经远大于有符号64位整型的最大值,加1后得到的27989065672496370938按补码规则转换为有符号64位值的计算过程为:
和你实际得到的运行结果完全一致,属于正常溢出表现。27989065672496370938 - 2 * 2^64 = 27989065672496370938 - 36893488147419103232 = -8904422474922732294 - 大整数运算解决方案:
如果需要处理超过64位的整数运算,不要使用Bash内置的算术扩展,可以改用支持任意精度运算的工具,示例如下:$ echo "27989065672496370937 + 1" | bc 27989065672496370938
内容的提问来源于stack exchange,提问作者zweiund40
相关产品推荐
相关产品推荐

