2016-04-25 4 views
0

背景私の32ビット整数がfloatに正しく変換されないのはなぜですか?すべての

まず、私はいくつかの進データ... 0x3AD3FFD6を持っています。私は次のようにバイトの配列としてデータを表現することを選択した:

byte[] numBytes = { 0x3A, 0xD3, 0xFF, 0xD6 }; 

Iは、以下のコードを実行することにより、その単精度浮動小数点値にバイトのこの配列を変換しよう:

float floatNumber = 0; 
floatNumber = BitConverter.ToSingle(numBytes, 0); 

私はthis IEEE 754 Converterを使用して、このオンラインを計算し、次の結果持っている:

0.0016174268

enter image description here

私はC#のコードの出力は、同じものを生産するために期待されるが、代わりに私は何かのような...

-1.406E + 14

質問を取得しています

ここで何が起こっているのか誰でも説明できますか?

+3

バイトの順序を逆にして、結果を比較します。それから、http://stackoverflow.com/questions/2945174/floating-point-endianness(関連する)を参照してください。BitConverterは特定のエンディアンを使用します。 – user2864740

+1

@ user2864740特定のものではなく、実際のコンピュータが使用するものです。異なるプラットフォームでは動作が異なります。 – Adrian

+0

これを試してください:floatNumber = BitConverter.ToSingle(numBytes.Reverse()。ToArray()、0); – jdweng

答えて

3

バイトの順序が間違っています。 BitConverterは、基礎となるシステム(コンピュータアーキテクチャ)のエンディアンを使用します。常に正しいエンディアンを使用してください。

+0

そうでした、ありがとうございました。 – Snoopy

0

クイックアンサー:numBytes配列のバイト順を逆順に取得しています。

あなたはC#でプログラミングしているので、私はあなたがインテルプロセッサで動作していると仮定し、インテルプロセッサはリトルエンディアンです。つまり、最下位バイトを最初に格納します(期待します)。あなたのnumBytes配列では、最上位バイトを最初に置いています。

BitConverter does not much バイト配列データをと解釈すると、が別の基本データ型と解釈されます。バイト配列を保持する物理メモリを考える:

b0 | b1 | b2 | b3。

バイト配列を単精度浮動小数点として解釈する場合は、LSByteが最初または最後に格納されている場合、エンディアンを認識する必要があります。 LSByteは、私たちの多くがそういう意味で読んでいるのですが、リトルエンディアン(Intel)プロセッサの場合は、当然のように見えるかもしれません。

+0

私は疑問に思っていましたが、配列にプロセッサと何が関係しているのかについてのリファレンスがありますか?それだけです...。NETはCPU上で実行されているものよりも高いレベルにあるため、この考え方は理解しにくいものです。ありがとうございました。 – Snoopy

+0

BitConverterの操作が2つのページに分かれているのは、https://msdn.microsoft.com/en-us/library/system.bitconverter.tosingle%28v=vs.110%29.aspxとhttps:// msdnです。 microsoft.com/en-us/library/system.bitconverter%28v=vs.110%29.aspx。後者は、例の後にいくつかの良い情報を持っています。私はあまりにも助けるかもしれない私の答えにいくつかの編集を加えました。 – VictorEE

関連する問題