2016-03-03 194 views
0

this question的启发和它的答案,我做了一些测试。 一个答案表明,数字太大(超出32位整数),它们会被截断,但这并不能解释结果。显然,它不会比较双方的字符串(正如我所预料的那样)。看起来if感到困惑,并认为“好吧,我不知道 - 给它一个真实的”。 (使用neq,gtr,lss而不是equ,geq,leq总是给出错误)。奇怪的结果与IF

如果任何a和/或b位于32位整数的边界内或包含[0-9]中的任何字符,则代码将按预期工作。

@echo off 
set a=333333333333 
set b=444444444444 
call :compare 
set b=222222222222 
call :compare 
goto :eof 

:compare 
echo comparing %a% with %b% 
if %a% geq %b% (echo a ^>= b) else (echo -) 
if %b% geq %a% (echo b ^>= a) else (echo -) 
if %a% leq %b% (echo a ^<= b) else (echo -) 
if %b% leq %a% (echo b ^<= a) else (echo -) 
if %a% equ %b% (echo a = b) else (echo -) 
if %a% == %b% (echo a == b) else (echo -) 

这是否有任何合乎逻辑的解释,还是仅仅是我们不得不忍受的事情?

+0

你期待什么发生?链接回到“这个问题”并没有提供背景使这成为一个独立的问题。 – Teepeemm

+0

我希望或者是一个字符串比较或者一个错误消息,但是**不是** _string1不等于AND并不小于AND不大于string2_所有在同一时间(并且它显然没有数字(从某种意义上说, cmd“的作品 - 这意味着不是一个32位INT),我希望它被作为字符串处理)。 'echo on'清楚地表明,没有截断或转换发生,所以它似乎不是'cmd'解析问题,而是'if'本身的问题。我想了解,发生了什么,为什么。 – Stephan

+0

[相关问题](http://stackoverflow.com/q/34491952/2152082) – Stephan

回答

1

这是一个限制。

C:>set /A a=333333333333 
Invalid number. Numbers are limited to 32-bits of precision. 
+0

是的,我完全了解32位整数及其限制。但我的问题不是关于'set/a',而是关于'if'。当'if'“检测到”非(INT32) - 数字时,它不应该使用字符串比较吗? (是的,我知道,把双方放在引号_forces_字符串比较,但这不是我的问题) – Stephan

+1

转换为字符串比较大数可能是一个理想的事情。它看起来并不是'cmd'的功能。如果代码有这么大数量的危险,为什么不引用它们并继续前进?你是否想过节省几微秒的时间?如果是这样,应选择另一种语言。 – lit

+0

'cmd'将它作为一个字符串处理 - 如果没有,则会出现语法或溢出错误。此外,'echo on'显示,它被解析。它是'if'本身,它无法处理它,并总是以'equ','geq'和'leq'给出TRUE,并且总是以'equ','geq'和'leq'为假。我想明白为什么。 – Stephan