WinXP 环境下, cmd 所能处理的数值范围是 [-2^31, 2^31-1], 之前认为 运算结果 超出此范围才发生溢出错误, 而在此范围内的 数值比较 不会发生溢出错误, 但是其实不然. 当两个数都在这个范围内, 但它们的差值的绝对值 大于或等于 2^31-1, 仍将发生溢出错误. 详见下面代码及运行结果:- @echo off
- (for /l %%i in (-2147483648,1,-2147483638) do (
- for /l %%j in (-10,1,10) do (
- if %%j gtr %%i (echo %%j>%%i) else (echo %%j<=%%i)
- if %%j geq %%i (echo %%j>=%%i) else (echo %%j<=%%i)
- if %%j equ %%i (echo %%j==%%i) else (echo %%j≠%%i)
- if %%j leq %%i (echo %%j<=%%i) else (echo %%j>%%i)
- if %%j lss %%i (echo %%j<%%i) else (echo %%j>=%%i)
- )))>t.txt
- type t.txt | findstr "<"&&pause
- :bigPlus
- echo 以下是大数接近 2^^31-1 的情况
- for /l %%j in (2147483637,1,2147483647) do (
- for /l %%i in (-10,1,10) do (
- if %%j gtr %%i (echo %%j>%%i) else (echo %%j<=%%i)
- if %%j geq %%i (echo %%j>=%%i) else (echo %%j<=%%i)
- if %%j equ %%i (echo %%j==%%i) else (echo %%j≠%%i)
- if %%j leq %%i (echo %%j<=%%i) else (echo %%j>%%i)
- if %%j lss %%i (echo %%j<%%i) else (echo %%j>=%%i)
- )>t.txt
- type t.txt | findstr "<"&&pause
- )
复制代码 在小的数接近 -2^31 时, 比较结果会发生溢出错误(差值溢出), 但显示的数值正常.
而在大数接近 2^31-1 时, 发生溢出错误时, 连显示的数值也出现错误 -- 标号 :bigPlus 后面的代码中, %%j 的取值一直是正数, 但显示结果却成了负数).
部分错误结果如下, 要查看完全的结果请运行上面的测试代码 及 扩大测试的范围
0<=-2147483648
0<=-2147483648
0<=-2147483648
0<-2147483648
1<=-2147483648
1<=-2147483648
1<=-2147483648
1<-2147483648
2<=-2147483648
2<=-2147483648
2<=-2147483648
2<-2147483648
.
.
.
1<=-2147483647
...
2<=-2147483646
...
3<=-2147483645
...
10<=-2147483638
10<=-2147483638
10<=-2147483638
10<-2147483638
请按任意键继续. . .
以下是大数接近 2^31-1 的情况
-2147483638<=10
-2147483638<=10
-2147483638<=10
-2147483638<10
请按任意键继续. . .
-2147483637<=10
-2147483637<=10
-2147483637<=10
-2147483637<10
请按任意键继续. . .
[ 本帖最后由 neorobin 于 2010-4-17 18:13 编辑 ] |