如何处理 bash 中值大于 2^63 的整数

How to handle integers in bash with values larger than 2^63

bash 的最大有符号整数值似乎是 9223372036854775807 (2^63)-1。 bash 有没有办法处理比这更大的值?我需要处理最多 10000000000000000000000000001 的数字,但我不确定如何在 bash.

中完成此操作
A=10000000000000000000000000000
echo $A
10000000000000000000000000000
let A+=1
echo $A
4477988020393345025

编辑 感谢本杰明 W. 的评论。基于此,我正在尝试以下策略。这有什么明显的问题吗?意思是,除了调用 bc 导致的一些性能损失外,使用 bc 增加我的变量是否会带来并发症?

A=10000000000000000000000000000
echo $A
10000000000000000000000000000
A=$(bc <<< "$A+1")
echo $A
10000000000000000000000000001

此外,我已经测试了一些 bash 操作(大于、小于等),它的行为似乎符合预期。例如:

A=10000000000000000000000000000

echo $A
10000000000000000000000000000

[[ "$A" -gt 10000000000000000000000000000 ]] && echo "A is bigger than 10000000000000000000000000000"

A=$(bc <<< "$A+1")

echo $A
10000000000000000000000000001

[[ "$A" -gt 10000000000000000000000000000 ]] && echo "A is bigger than 10000000000000000000000000000"
A is bigger than 10000000000000000000000000000

我建议使用具有任意精度的 bc

Bash 在 263:

溢出
$ A=$(( 2**63 - 1 ))
$ echo $A
9223372036854775807
$ echo $(( A+1 ))
-9223372036854775808

bc 可以处理这个:

$ bc <<< "$A+1"
9223372036854775808

不过,从现在开始,这些数字必须用 bc 处理。使用[[ ]],它们似乎没有溢出,但是比较不正常:

$ B=$(bc <<< "$A+1")
$ echo $B
9223372036854775808
$ set -vx
$ [[ $B -gt -$A ]] && echo true
[[ $B -gt -$A ]] && echo true
+ [[ 9223372036854775808 -gt -9223372036854775807 ]]

并且在算术上下文中 (( )),它们会溢出:

$ echo $(( B ))
-9223372036854775808

所以比较也不起作用:

$ (( B > A )) && echo true || echo false
false

用 bc 处理它们:

$ bc <<< "$B > $A"
1

并且由于在 (( )) 中非零结果评估为真,零为假,我们可以使用

$ (( $(bc <<< "$B > $A") )) && echo true
true