以下是我的剧本
#!/bin/sh
typeset resl=$(($1+$2))
echo $resl
当我将两个值 173591451 和 2000252844 传递给shell脚本时,它返回负值。
./ addvalue.sh 173591451 2000252844
输出--->的 -2121123001
请告诉我们如何解决这个问题?
答案 0 :(得分:1)
放入友好的编程计算器应用程序以十六进制查看您的值我看到您的精度为32位。一旦你达到32位(第8位> = 8),你已经超过了你的shell编译的整数大小,并进入负数的土地(但这是另一篇文章)。
0x81923B47 = 0xA58CB9B + 0x77396FAC
两个解决方法,无需担心获得64位shell,请遵循。
1。 AWK
这取决于你编译awk的方式以及你使用的awk。
awk 'END {print 173591451 + 2000252844}' </dev/null
还要在awk中进行所有关系测试。
2。直流
“dc”程序(桌面计算器)使用任意精度,因此您再也不用担心整数位大小了。把它放到一个变量中:
$ sum="$( echo 173591451 2000252844 + p | dc )"; echo $sum 2173844295
避免typeset -i
与 dc ,因为shell需要查看字符串。正确检查关系(如果$a < $b
)有点棘手,但可以完成($a -lt $b
是错误的。)