• ベストアンサー

float 型のデータのメモリ上での理解の仕方

詳しい方教えていただけると助かります。 OS:LINUX コンパイラ:GCC 以下のプログラムを実行し、結果ファイルの test.txt を od で見ると 期待した通りの結果になりません。long 型や、short型は期待通りの結果になるのですが。  どういうロジックを経て、以下のような数値になっているのでしょうか?変換ロジック等がわかるとありがたいのですが・・・。 #include <stdio.h> main() { float f; char line[4]; FILE *fp; f = 1234; memcpy(&line[0], &f, sizeof(float)); fp = fopen("test.txt", "w"); fputc(line[0], fp); fputc(line[1], fp); fputc(line[2], fp); fputc(line[3], fp); fclose(fp); } test.txt 内容を od した結果の数値 0000 c000 8c29 4167

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

  • ベストアンサー
  • tatsu99
  • ベストアンサー率52% (391/751)
回答No.5

こちらの環境では、以下のようになりました。 od -t x1 test.txtの結果が 00 40 9a 44 となります。 od -t x test.txt なら 449a4000 です。 od test.txtなら 040000 042232 です。 odコマンドは具体的には、どのようなオプションを指定されてますか。 実行環境は以下の通りです。 CPU INTEL系 OS CentOS release 4.4 gcc 3.4.6

その他の回答 (5)

noname#233826
noname#233826
回答No.6

この処理の結果、8バイトのファイルができているということでしょうか。fputc() は1バイト出力すると思いますので、4バイトのファイルができているはずですが……。 一度、test.txt を削除し、コンパイルもやり直してから実行しても同じ結果でしょうか。"od -t x1 test.txt" の結果を見たいですね。

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

#1 ですが, この結果が本当なら IEEE754 を見ても幸せにはなれないです. すみません. IEEE754 なら 1234 は 449a4000 になります. とりあえずお使いの CPU と gcc のバージョンを示してもらえませんか?

  • asuncion
  • ベストアンサー率33% (2127/6289)
回答No.3

たぶん、float型の1234.0という数値は、メモリに 41678c29c0000000 と格納していると思うのです。 odでそういう出力結果を得るのは、エンディアンネスが関係していると思うのです。 お使いのマシンは、たぶんリトルエンディアンだろうと思うのです。 エンディアンネスやリトルエンディアン(ビッグエンディアンっていうのもあります)について よくわからなければ、GoogleやWikipediaあたりで調べてみればよいと思うのです。

motodani
質問者

お礼

od -x test.txt としていたので、並びがおかしかったようです。 ありがとでした。

  • arain
  • ベストアンサー率27% (292/1049)
回答No.2

確認手順として、fputc()の第一引数にcharを入れている時点でもおかしくなる。 fputc()の第一引数はint。 charなのに、0x00~0xFF以上の値が出力されたらおかしいと思いませんか?

motodani
質問者

お礼

大変失礼しました。色々試していたので、質問の記事の切り貼りに失敗してしまっていました。 ただ、fputc()の第一引数は int 型ですが、上記プログラムの動作には問題ないとおもいます。od の結果を double型のテスト結果を貼り付けてしまっていたのです(汗)大変失礼しました。

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

多分, IEEE754 を調べると幸せになれると思う.

motodani
質問者

お礼

職場から質問は書けたのですが、お礼を書こうとすると、ブロックがかかってしまい、返事が遅れてしまいました。 そうか、まず、IEEE754が前提条件としてあったわけですね。ありがとです。  自分の書いた最初の記事が不正確なものになってしまっていたので迷惑をかけたみたいですいません(汗)  大変助かりました、ありがとでした。

関連するQ&A

専門家に質問してみよう