重要なお知らせ

「教えて! goo」は2025年9月17日(水)をもちまして、サービスを終了いたします。詳細はこちら>

【GOLF me!】初月無料お試し

詳しい方教えていただけると助かります。

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

A 回答 (6件)

こちらの環境では、以下のようになりました。


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
    • good
    • 0

この処理の結果、8バイトのファイルができているということでしょうか。

fputc() は1バイト出力すると思いますので、4バイトのファイルができているはずですが……。

一度、test.txt を削除し、コンパイルもやり直してから実行しても同じ結果でしょうか。"od -t x1 test.txt" の結果を見たいですね。
    • good
    • 0

#1 ですが, この結果が本当なら IEEE754 を見ても幸せにはなれないです. すみません. IEEE754 なら 1234 は 449a4000 になります.


とりあえずお使いの CPU と gcc のバージョンを示してもらえませんか?
    • good
    • 0

たぶん、float型の1234.0という数値は、メモリに


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

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

お礼日時:2008/07/17 00:01

確認手順として、fputc()の第一引数にcharを入れている時点でもおかしくなる。


fputc()の第一引数はint。

charなのに、0x00~0xFF以上の値が出力されたらおかしいと思いませんか?
    • good
    • 0
この回答へのお礼

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

お礼日時:2008/07/16 23:57

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

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

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

お礼日時:2008/07/16 23:53

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