2016-07-25 43 views
1

何らかの理由で、PowerShellの一部の値を16進数から16進数に変換すると、正しくない値になります。10進数から16進数への変換 - PowerShell 5

- タイプ0xC0000000入力したら、-1073741824が正しく入力されます。正しい値は3221225472です。答えは、私が入力した負の16進数の値ですFFFFFFFFC0000000

これは解釈上の問題だと思っていましたので、値を16進数から10進数に10進数に変換するよう明示的に求められましたが、 -1073741824

[Convert]::ToString(0xc0000000,10) 

なぜPowerShellは六角番号c0000000用負として0xc0000000を解釈していますか?私はここに何かを逃している?

答えて

1

これはPowerShellの問題点です(以前のバージョンでも存在します)。この値は、実際には符号なし整数にする場合は符号付き整数として解釈されます。

[uint32]"0xC0000000" 
+0

です。意味あり。ありがとう。 – RonaDona

2

アンスガーalready provided the work-aroundが、何が起こっているかについて、いくつかの説明が参考になります。あなたは問題を回避するために、このような変換を行う必要があります。

この現象の根本的な原因は、バイナリシステムが原因です。それは本当に負の数の概念を持っていません。ちょうどビットがあります:一連の1と0。数字を正または負のいずれかと解釈するために、creative trickeryが発明されました。

あなたのケースではどうなるのですか?0xC <=> 12dec <=> 1100 binです。したがって、最初のビットが1であるため、ビットパターンは負の値として解釈され、結果として-1073741824が得られます。ところで、これは、Windowsのエラーメッセージのなかに無意味なエラーコードが含まれている理由です。

+0

これは基本的に私が「符号付き整数として解釈する」という意味です。 ;) –

+0

返事をありがとう。これは、なぜ最も左の16桁目が使用されるのだろうと思ったので、署名されたintが負の数であると考えられたのかをはっきりさせますが、これを読んだ後、私はそれを取得します。 Windowsは時々ファンキーなことをする。 – RonaDona

関連する問題