在以下脚本中作为输出的一部分,我得到: = -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
答案 0 :(得分:2)
我重复了David Ruhmann和Endoro的答案以及一些额外的信息。
在Rules for how CMD.EXE parses numbers解释为什么值-2147483648
导致在Windows Vista,Windows 7以及Windows 8上解析数字时出现无效数字错误消息,而Windows XP上没有问题。字符串到有符号/无符号的int转换的代码在cmd.exe
的源代码中编写得很差,因此不能用于最小有符号的32位整数。
此批处理文件的一个解决方案是使用
set /a ADDR+=%%~zA
而不是
set /a ADDR=%ADDR%+%%~zA
因为这导致命令行
set /a ADDR+=312704
而不是
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 ++的大多数limits.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上也没有执行批处理文件的问题。