2016-09-21 5 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は、符号付き2の補数の32ビット整数の完全な適用範囲内ですが、なぜそのように動作しますか?

そして定数-2147483648をset /Aの式に直接記述する方法はありますか?

set NEGLIM=-2147483648のような値にプリセットされている変数を使用して、set /A NEGLIMのような拡張されていない方法で使用できますが、その値をすぐに提供する方法はありませんか?

+1

numberを正の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

バイナリ2の補数表現を見ると' set/A -2147483647-2 '明らかになる... ;-) – aschipfl

2

私は興味深い発見事実:16進表現を使用する場合、負の限界値は次のように与えられます。

set /A -0x80000000 

あるいは(も原因2の補数表現に-2147483648になる):

set /A +0x80000000 

しかし、進表記がちょうど小数1のように失敗します。プログラムが扱うので

rem These fail: 
set /A -020000000000 
set /A +020000000000 
関連する問題