Batch file 批处理文件中已签名的32位加法,给出的数字无效

Batch file 批处理文件中已签名的32位加法,给出的数字无效,batch-file,32-bit,signed,Batch File,32 Bit,Signed,在以下作为输出一部分的脚本中,我得到: =-2147483648+312704 无效号码。数字的精度限制为32位 这显然在有符号32位数字的范围内 (我还尝试了2147483648+312704,认为只支持无符号32),但得到了相同的错误 奇怪的是,这个脚本在WindowsXP上运行得很好,但是当我在Windows7上尝试它时,我得到了上面的错误 为什么批处理不执行此操作 为方便起见,代码如下 setlocal EnableDelayedExpansion @set TEMPDIR="%CD%

在以下作为输出一部分的脚本中,我得到: =-2147483648+312704 无效号码。数字的精度限制为32位

这显然在有符号32位数字的范围内 (我还尝试了2147483648+312704,认为只支持无符号32),但得到了相同的错误

奇怪的是,这个脚本在WindowsXP上运行得很好,但是当我在Windows7上尝试它时,我得到了上面的错误

为什么批处理不执行此操作

为方便起见,代码如下

setlocal EnableDelayedExpansion

@set TEMPDIR="%CD%\temp739123834543"
@set ADDR=-2147483648
@set HEXADDR=
@set /a ZIPSLEEP_MS=0

@del frontScreenImages.c
@del frontScreen.zip
@mkdir %TEMPDIR%

for %%f in (*.png) do (

    echo %%~nf
    @call toHex ADDR HEXADDR
    echo "ADDR:!HEXADDR!"
    convertFrontScreenPng.exe %%~nf.png frontScreenImages.c transpose append "0x!HEXADDR!" "__xdata_rom" "#pragma required="
rem    set BINFILE=%TEMPDIR%\a!HEXADDR!_%%~nf.bin
    set BINFILE=%TEMPDIR%\a80000000_frontScreenImages.bin
    echo "BIN:!BINFILE!"
    convertFrontScreenPng.exe %%~nf.png !BINFILE! transpose append
    for %%A in (!BINFILE!) do set /a ADDR=%ADDR%+%%~zA
    set /a ZIPSLEEP_MS=!ZIPSLEEP_MS! + 500
)

@echo Set objArgs = WScript.Arguments > _zipIt.vbs
@echo InputFolder = objArgs(0) >> _zipIt.vbs
@echo ZipFile = objArgs(1) >> _zipIt.vbs
@echo CreateObject("Scripting.FileSystemObject").CreateTextFile(ZipFile, True).Write "PK" ^& Chr(5) ^& Chr(6) ^& String(18, vbNullChar) >> _zipIt.vbs
@echo Set objShell = CreateObject("Shell.Application") >> _zipIt.vbs
@echo Set source = objShell.NameSpace(InputFolder).Items >> _zipIt.vbs
@echo objShell.NameSpace(ZipFile).CopyHere(source) >> _zipIt.vbs
@echo wScript.Sleep !ZIPSLEEP_MS! >> _zipIt.vbs

@CScript  _zipIt.vbs  %TEMPDIR%  "%CD%\frontScreen.zip"

@del   _zipIt.vbs
@rmdir %TEMPDIR% /s /q
sleep 3
我用一些额外的信息重复和的答案

下面将解释为什么值
-2147483648
在Windows Vista、Windows 7以及Windows 8上解析数字时会导致无效数字错误消息,而在Windows XP上则没有问题。字符串到有符号/无符号整数转换的代码在
cmd.exe
的源代码中编写得很差,因此对于最小有符号32位整数来说不正常

此批处理文件的一个解决方案是使用

set /a ADDR+=%%~zA
而不是

set /a ADDR=%ADDR%+%%~zA
set /a ADDR=-2147483648+312704
因为这会导致命令行

set /a ADDR+=312704
而不是

set /a ADDR=%ADDR%+%%~zA
set /a ADDR=-2147483648+312704
但这并不是解决问题的唯一办法

@echo off
set VALUE1=-2147483648
set VALUE2=312704
set /a RESULT=%VALUE1%+%VALUE2%
echo Result of %VALUE1% + %VALUE2% is %RESULT%
导致在Windows 7和Vista上执行时出现错误消息

另一个解决方案是C/C++的most
限制.h
包含的INT_MIN预处理器宏,以避免在编码不好的预处理器上出现相同的问题:将最小有符号32位整数定义为表达式,而不是固定值

#define INT_MIN  (-2147483647-1)
#define LONG_MIN (-2147483647L-1L)
此解决方案适用于上面的小批量文件:

@echo off
set VALUE1=(-2147483647-1)
set VALUE2=312704
set /a RESULT=%VALUE1%+%VALUE2%
echo Result of %VALUE1% + %VALUE2% is %RESULT%

现在,即使在Windows 7和Vista上,批处理文件的执行也没有问题。

Try
set/a ADDR+=%%~zA
这会阻止命令行解析器验证MIN_INT值。出于某些奇怪的原因,Windows 7
set/a
支持将
-2147483648
2147483647
之间的值保存在等式中,但只允许将
-2147483647
2147483647
之间的值保存在等式中。太棒了!那帮我修好了。我将标记为已回答。也感谢链接中的数字是如何解析的。我找了这么多,但显然是找错地方了