2017-06-01 155 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個字符」