2016-09-21 77 views
3

正如您可能已經注意到的那樣,-2147483648 = -2 是有符號的32位整數範圍的負極限。爲什麼我不能直接在`set/A`的表達式中使用-2147483648?

當我嘗試從字面上使用這個值...:

set /A -2147483648 

...,會出現以下錯誤:

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

不過,我可以聲明正限制2147483647 = 2 - 1沒有任何問題:

set /A 2147483647 

那麼爲什麼set /A表現如此,儘管這個數字完全在有符號二進制補碼32位整數的適用範圍內?

有沒有辦法在set /A表達式中直接聲明常量-2147483648?

我知道,我可以使用一個預設爲該值的變量,如set NEGLIM=-2147483648,然後以未展開的方式使用它,例如set /A NEGLIM,但是沒有提供該值的直接方法嗎?

+1

由於程序對待數字作爲一個正的32位數,然後否定它?只是一個猜測。 – Mick

+1

我已經調查過這個問題,以及與CMD.EXE中的數字解析相關的許多其他問題。我在DosTips的[CMD.EXE如何解析數字的規則](http://www.dostips.com/forum/viewtopic.php?t=3758)中發佈了我的結果。我想你會覺得很有趣。 – dbenham

+0

哇,我印象深刻,工作很好!非常感謝鏈接!我真的很震驚在Windows XP和更高版本中'set/A'的行爲差異......:-O – aschipfl

回答

3

我提出以下解決方法:

set /A -2147483647-1 

結果:

-2147483648 

搞笑注:set /A -2147483647-2產量2147483647所以與限制玩弄危險:)

+1

如果你看一下二進制二進制補碼錶示,'set/A -2147483647-2 '變得明顯...... ;-) – aschipfl

2

我剛剛發現了一個有趣事實:當使用十六進制表示時,可以給出負極限:

set /A -0x80000000 

或(也導致-2147483648由於二進制補碼錶示):

set /A +0x80000000 

然而,八進制失敗就像十進制之一:

rem These fail: 
set /A -020000000000 
set /A +020000000000 
相關問題