如果大于在批处理文件
我有一个非常愚蠢的问题,但无法弄清楚什么是错的如果大于在批处理文件
我做的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
gtr
比较中的数字是否有限制?
是的,真的有是。
你被限制为32位有符号整数,如果有溢出,它被设置为最大值。
由于都这些数字,135149772801
和111110000000
,太大,他们都转换为231 - 1
。
这就是为什么它说第一个不会更大(顺便说一下,它稍微有些不同),但它是大于或等于。
更多细节可在优秀的dostips site找到。
A 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
循环检索结果。
它们看起来最多是_clamped_,而不是环绕到负数。 – TripeHound
@TripeHound在我的Win7上,它扭曲回到负数 – SteveFest
奇数。在我的'如果0x81234567等0x7fffffff(回声等于)其他(回声不等于)'显示'等于'这表明钳位。 – TripeHound
围绕32位限制的一种方法是在数字字符串前加上一个好数字0
,然后在最后一个字符处使用字母比较。
因此
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个字符”
批次算术(和编号coparision)限制为我建议把'的±2^31范围 –
@echo off'在你的批处理文件的开头,这样你就不必在每个命令的前面加上'@' –