为什么我不能直接在'set / A`的表达式中使用-2147483648?

时间:2016-09-21 21:01:21

标签: batch-file cmd

您可能已经注意到,-2147483648 = -2 31 是带符号的32位整数范围的负限制。

当我尝试按字面意思使用这个值时......:

set /A -2147483648

...,发生以下错误:

Invalid number.  Numbers are limited to 32-bits of precision.

但是,我可以毫无困难地说明正限制2147483647 = 2 31 - 1:

set /A 2147483647

那么为什么set /A表现得那样,虽然这个数字完全在有符号的二进制补码32位整数的适用范围内?

有没有办法直接在set /A表达式中声明常量-2147483648?

我知道,我可以使用预设为该值的变量,例如set NEGLIM=-2147483648,然后以未扩展的方式使用它,例如set /A NEGLIM,但是没有立即提供的方式这个值?

2 个答案:

答案 0 :(得分:3)

我建议采用以下解决方法:

set /A -2147483647-1

结果:

-2147483648

有趣的说明:set /A -2147483647-2会产生2147483647,因此玩弄极限是危险的:)

答案 1 :(得分:2)

我刚刚发现一个有趣的事实:当使用十六进制表示时,可以给出负限制:

fwrite($file777, trim($file1[$f1])." ".trim($file2[$f2])." ".($file3[$f3]) );

或(由于两个补码表示,也导致-2147483648):

set /A -0x80000000

但是,八进制表示法与十进制表示法一样失败:

set /A +0x80000000