在用SET /A进行运算时, (如果字符的第一位数为零,并且数值中含有8或9), 会导致数值不能正确读取.
因为除十六进制有 0x 前缀, 八进制有 0 前缀的, 数字值为十进位数字。因此, 0x12 与 18 和 022
相同。请注意八进制公式可能很容易搞混: 08 和 09 是无效的数字,因为 8 和 9 不是有效的
八进制位数。
例:
C:\>set /a minute=08+5
无效数字。数字常数只能是十进制(17),十六位进制(0x11)或
八进制(021)。
C:\>set /a minute=5+018
无效数字。数字常数只能是十进制(17),十六位进制(0x11)或
八进制(021)。
C:\>set /a minute=0029+8
无效数字。数字常数只能是十进制(17),十六位进制(0x11)或
八进制(021)。
C:\>set /a minute=125+09
无效数字。数字常数只能是十进制(17),十六位进制(0x11)或
八进制(021)。
解决方法:
1. 在运算常量时, 如果常量中含有8或9, 前面不要加零, 总之最高位数不能为零.
例: 错误 (08, 009, 018, 0029)
正确 (8, 9, 18, 29)
2. 防止变量运算时变量的最高位数为零;
算法:
首先取变量的第一位数, 判断其是否为零;
如果成立,则取出第一位后的余数, 重新赋予变量;
执行循环直到第一位数不为零止;
最后用去零的变量进行运算.
代码:
@echo off
set mu=0001028
echo 去零前=%mu%
:again
if "%mu:~0,1%"=="0" (
set mu=%mu:~1%
goto again
)
echo 去零后=%mu%
set /a num=%mu%+154
echo 运算结果=%num%
pause
今天在写批处理脚本时遇到了这个问题, 终于把其中的原因弄明白了.
也找到了解决方法, 以后大家遇到相应的问题时可以避免走弯路.
[ Last edited by pengfei on 2006-10-2 at 09:41 ]
因为除十六进制有 0x 前缀, 八进制有 0 前缀的, 数字值为十进位数字。因此, 0x12 与 18 和 022
相同。请注意八进制公式可能很容易搞混: 08 和 09 是无效的数字,因为 8 和 9 不是有效的
八进制位数。
例:
C:\>set /a minute=08+5
无效数字。数字常数只能是十进制(17),十六位进制(0x11)或
八进制(021)。
C:\>set /a minute=5+018
无效数字。数字常数只能是十进制(17),十六位进制(0x11)或
八进制(021)。
C:\>set /a minute=0029+8
无效数字。数字常数只能是十进制(17),十六位进制(0x11)或
八进制(021)。
C:\>set /a minute=125+09
无效数字。数字常数只能是十进制(17),十六位进制(0x11)或
八进制(021)。
解决方法:
1. 在运算常量时, 如果常量中含有8或9, 前面不要加零, 总之最高位数不能为零.
例: 错误 (08, 009, 018, 0029)
正确 (8, 9, 18, 29)
2. 防止变量运算时变量的最高位数为零;
算法:
首先取变量的第一位数, 判断其是否为零;
如果成立,则取出第一位后的余数, 重新赋予变量;
执行循环直到第一位数不为零止;
最后用去零的变量进行运算.
代码:
@echo off
set mu=0001028
echo 去零前=%mu%
:again
if "%mu:~0,1%"=="0" (
set mu=%mu:~1%
goto again
)
echo 去零后=%mu%
set /a num=%mu%+154
echo 运算结果=%num%
pause
今天在写批处理脚本时遇到了这个问题, 终于把其中的原因弄明白了.
也找到了解决方法, 以后大家遇到相应的问题时可以避免走弯路.
[ Last edited by pengfei on 2006-10-2 at 09:41 ]
