• ベストアンサー

C#のキャストについて(32bit浮動小数点)

こんにちは。 現在、Visual Studio 2005を使用してC#のプログラムを作成しています。 32bitの浮動小数点のデータを表示しようとしているのですがうまくいきません。 具体的な例としては 0x42F6E9E0  → 123.456789 0x4476E9E0  → 987.654321 のように変換した結果を表したいと考えています。 c言語では int main() { int h = 0x42F6E9D5; float f; f = *(float *)(&h); return 0; } のようにすればfで値(123.45678)が取得できたのですが、 これと同じ事をC#ではどのように書くのでしょうか? ポインタを含んだキャストのやり方がわかりません。 以上よろしくお願い致します。

質問者が選んだベストアンサー

  • ベストアンサー
回答No.1

C#は基本的にポインタなぞない(できるかもしれないが普通は使わない) こういう風に書きます namespace Q4974299 { class Q4974299A { public static void Main(string[] args) { int i = 0x42F6E9D5; System.Console.WriteLine(System.BitConverter.ToSingle(System.BitConverter.GetBytes(i),0)); //123.4567 System.Console.ReadKey(true); //何かキーが押されるまで待機 } } }

itouke77
質問者

お礼

ありがとうございます。 便利なメソッドがあるんですね。 MSDNで調べてみます。

その他の回答 (3)

  • Gotthold
  • ベストアンサー率47% (396/832)
回答No.4

誤差とかそういう問題じゃない。 処理系の浮動小数点数の表現方式が期待している方式と異なっていれば 期待しているのとは全く異なる値になる。

itouke77
質問者

お礼

ご指摘ありがとうございました。 なるほどそういうことでしたか。 確かにその通りですね。 浮動小数点について確認してみます。

  • Tacosan
  • ベストアンサー率23% (3656/15482)
回答No.3

念のためですが, 「C言語」ではそのコードで期待した値が得られることを保証していません.

itouke77
質問者

お礼

ご指摘ありがとうございます。 実際に誤差が生じるとしたらどの程度になるのでしょうか?

回答No.2

基本的に、No1さんがおっしゃるようにC#ではポインタという概念はありません。 でもどうしてもポインタを使いたい場合があったりします。 たとえば、画像処理プログラムなどで、 読み込んだ画像のピクセルデータを変換したいとか(RGB要素を入れ換えるとか) だと、GetPixelメソッドなりを使用するのが一般的かもしれません。 ただ、実はこの処理が非常に遅かったりします。 そこで、読み込んだ画像データをメモリ上で操作すれば高速化します。 この時にポインタを使用します。 C#でポインタを使用するためには、unsafeコードで記述します。 参考サイト http://www.atmarkit.co.jp/fdotnet/csharp_abc/csharp_abc_021/csharp_abc05.html unsafe { unsafeコード内ではポインタが使用できます。 } 今回の質問の内容をunsafeコードで記述すると…。 int i = 0x42F6E9D5; unsafe { int* ip = &i; float* fp = (float*)ip; float f = *fp; } これで、float型fの中身はお望みの値になってるかと思います。 (※)unsafeコードを記述するにはプロジェクトプロパティのビルド項目で、    アンセーフコードの許可を指定してください。

itouke77
質問者

お礼

ありがとうございます。 自分はC言語から入っていったのでこちらの記述はしっくりきます。 sonata1229さんのおっしゃる通り、用途次第で使い分ける必要がありそうですね。 参考になります。