プロが教えるわが家の防犯対策術!

こんにちは。
現在、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#ではどのように書くのでしょうか?

ポインタを含んだキャストのやり方がわかりません。

以上よろしくお願い致します。

A 回答 (4件)

誤差とかそういう問題じゃない。


処理系の浮動小数点数の表現方式が期待している方式と異なっていれば
期待しているのとは全く異なる値になる。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/05/20 23:12

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

    • good
    • 0
この回答へのお礼

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

お礼日時:2009/05/20 15:39

基本的に、No1さんがおっしゃるようにC#ではポインタという概念はありません。


でもどうしてもポインタを使いたい場合があったりします。

たとえば、画像処理プログラムなどで、
読み込んだ画像のピクセルデータを変換したいとか(RGB要素を入れ換えるとか)
だと、GetPixelメソッドなりを使用するのが一般的かもしれません。
ただ、実はこの処理が非常に遅かったりします。
そこで、読み込んだ画像データをメモリ上で操作すれば高速化します。
この時にポインタを使用します。

C#でポインタを使用するためには、unsafeコードで記述します。
参考サイト
http://www.atmarkit.co.jp/fdotnet/csharp_abc/csh …

unsafe
{
unsafeコード内ではポインタが使用できます。
}

今回の質問の内容をunsafeコードで記述すると…。
int i = 0x42F6E9D5;
unsafe
{
int* ip = &i;
float* fp = (float*)ip;
float f = *fp;
}

これで、float型fの中身はお望みの値になってるかと思います。

(※)unsafeコードを記述するにはプロジェクトプロパティのビルド項目で、
   アンセーフコードの許可を指定してください。
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/05/20 12:19

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); //何かキーが押されるまで待機
}
}
}
    • good
    • 0
この回答へのお礼

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

お礼日時:2009/05/20 12:16

お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!