ページ 11

C言語の実数と整数について

Posted: 2007年5月19日(土) 15:22
by micheal
情報処理で、

printf("%d",1.1) としたら -1717986918

と出力されたのはなぜかという宿題が出たのですが、

%dのあとには整数しか入れてはいけないのでエラーが出ることはわかるのですが、
実際にコンピューターの中ではどんなことが起きているのでしょうか?

Re:C言語の実数と整数について

Posted: 2007年5月19日(土) 20:19
by box
1.1というdouble型の値を、計算機の内部で
どのように保持しているかはおわかりですか?

Re:C言語の実数と整数について

Posted: 2007年5月19日(土) 20:27
by micheal
すみません、あまりよく理解していません。

Re:C言語の実数と整数について

Posted: 2007年5月19日(土) 20:58
by YuO
私だったら「たまたま」とだけ答えます。
理由は,引数の型が要求された型と異なるときは未定義の振る舞いであると,規格に定められているからです。
# ISO/IEC 9899:1999 7.19.6.1 The fprintf function / Paragraph.9 後段。

特定のコンパイラとその実装,およびドキュメントが指定されていれば別の回答があるかもしれませんが。

Re:C言語の実数と整数について

Posted: 2007年5月19日(土) 21:03
by micheal
YuOさんありがとうございました。

なんとなくですがわかったような気がします。

Re:C言語の実数と整数について

Posted: 2007年5月19日(土) 21:25
by box
すでに解決済みのようですけれど…。

浮動小数点数を保持する代表的な方式に「IEEE方式」があります。
この方式では、1.1 という数値が double 型で、sizeof(double)==8 だとすると、
その数値を保持するために 0x3ff199999999999a というビットパターンを持ちます。

このビットパターンを "%d" という int 型に対応する書式文字列で出力しようとするとき、
下位「sizeof(int)」バイトの分を出力し、それより上位の分は無視します。

sizeof(int)==4 だとすると、0x3ff199999999999a の下位 4 バイトは
0x9999999a となります。これは、十進数にすると -1717986918 です。

宿題をお出しになったかたは、「たまたま」上記のような環境で
仕事をなさっているのかもしれませんし、そうではないのかもしれません。

なお、「実数 内部表現」あたりのキーワードでググってみると、
計算機の内部で実数をどのように保持しているかがわかって、
おもしろい(あるいは、大しておもしろくない)かもしれません。