我有一个非常愚蠢的问题,但无法弄清楚出了什么问题
我在if语句中进行基本级别编号比较。脚本粘贴在下面。 geq-大于或等于工作正常,但gtr-大于有问题。 gtr比较中的数字是否有限制?
if 3 gtr 2 (@echo "greater") else (@echo "lesser")
greater
if 3 geq 2 (@echo "greater") else (@echo "lesser")
greater
if 135149772801 gtr 111110000000 (@echo "greater") else (@echo "lesser")
lesser
if 135149772801 geq 111110000000 (@echo "greater") else (@echo "lesser")
greater
答案 0 :(得分:3)
gtr
比较中的数字是否有限制?
是的,确实是。
您只能使用32位有符号整数,如果有溢出,则将其设置为最大值。
由于这两个这些数字135149772801
和111110000000
太大,所以它们都被转换为231 - 1
。
这就是为什么它说第一个不是更大(顺便说一下,它与次要的略有不同)但 大于或等于。
更多细节可以在优秀的dostips site找到。
答案 1 :(得分:2)
绕过32位限制的方法是在数字字符串前加上一个很好的0
,然后在最后的 n 字符上使用字母比较。
因此
set "num1=135149772801"
set "num2=111110000000"
set "zeroes=00000000000000000000000000000000000000000000000000000"
set "comp1=%zeroes%%num1%"
set "comp2=%zeroes%%num2%"
if "%comp1:~-20%" gtr "%comp2:~-20%" (echo greater) else (echo not greater)
其中“-20”表示“取最后20个字符”
答案 2 :(得分:0)
batch-file本身仅支持32位有符号整数运算。如果数字超过2147483648,它会溢出并回转到负数。但是,在if
语句中,数字会变得混乱,回到2^31-1
。
Code | Code Result | Actual Result
-----------------------+-------------------+-----------------------
2147483647 + 1 2147483648 2147483648
2147483648 + 1 -2147483648 2147483649
以下是一些可行的解决方法:
powershell
或vbs
进行比较)嵌入式Powershell
解决方案:
for /f %p in ('powershell -command if (1 -gt 0^) {write-host greater} else {write-host lesser}') do echo %p
此命令调用powershell
进行比较,并使用for
循环检索结果。