2017-06-01 117 views
1

我有一个非常愚蠢的问题,但无法弄清楚什么是错的如果大于在批处理文件

我做的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 
+1

批次算术(和编号coparision)限制为我建议把'的±2^31范围 –

+1

@echo off'在你的批处理文件的开头,这样你就不必在每个命令的前面加上'@' –

回答

3

gtr比较中的数字是否有限制?

是的,真的有是。

你被限制为32位有符号整数,如果有溢出,它被设置为最大值。

由于这些数字,135149772801111110000000,太大,他们都转换为231 - 1

这就是为什么它说第一个不会更大(顺便说一下,它稍微有些不同),但它大于或等于。

更多细节可在优秀的dostips site找到。

0

A 原生支持32位有符号整数算术只。如果数字超过2147483648,它会溢出并跳回到负数。然而,在if声明中,数字变得混乱回到2^31-1

Code     | Code Result  | Actual Result 
-----------------------+-------------------+----------------------- 
2147483647 + 1   2147483648   2147483648 
2147483648 + 1   -2147483648   2147483649 

下面是一些可能的解决方法:

  • 搓背数
  • 其他脚本语言(使用powershellvbs比较)
(比较之前做的数量少)

嵌入式Powershell解决方案离子:

for /f %p in ('powershell -command if (1 -gt 0^) {write-host greater} else {write-host lesser}') do echo %p 

此命令调用powershell进行比较,并使用for循环检索结果。

+1

它们看起来最多是_clamped_,而不是环绕到负数。 – TripeHound

+0

@TripeHound在我的Win7上,它扭曲回到负数 – SteveFest

+0

奇数。在我的'如果0x81234567等0x7fffffff(回声等于)其他(回声不等于)'显示'等于'这表明钳位。 – TripeHound

2

围绕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个字符”