情報処理で、
printf("%d",1.1) としたら -1717986918
と出力されたのはなぜかという宿題が出たのですが、
%dのあとには整数しか入れてはいけないのでエラーが出ることはわかるのですが、
実際にコンピューターの中ではどんなことが起きているのでしょうか?
C言語の実数と整数について
Re:C言語の実数と整数について
私だったら「たまたま」とだけ答えます。
理由は,引数の型が要求された型と異なるときは未定義の振る舞いであると,規格に定められているからです。
# ISO/IEC 9899:1999 7.19.6.1 The fprintf function / Paragraph.9 後段。
特定のコンパイラとその実装,およびドキュメントが指定されていれば別の回答があるかもしれませんが。
理由は,引数の型が要求された型と異なるときは未定義の振る舞いであると,規格に定められているからです。
# ISO/IEC 9899:1999 7.19.6.1 The fprintf function / Paragraph.9 後段。
特定のコンパイラとその実装,およびドキュメントが指定されていれば別の回答があるかもしれませんが。
Re:C言語の実数と整数について
すでに解決済みのようですけれど…。
浮動小数点数を保持する代表的な方式に「IEEE方式」があります。
この方式では、1.1 という数値が double 型で、sizeof(double)==8 だとすると、
その数値を保持するために 0x3ff199999999999a というビットパターンを持ちます。
このビットパターンを "%d" という int 型に対応する書式文字列で出力しようとするとき、
下位「sizeof(int)」バイトの分を出力し、それより上位の分は無視します。
sizeof(int)==4 だとすると、0x3ff199999999999a の下位 4 バイトは
0x9999999a となります。これは、十進数にすると -1717986918 です。
宿題をお出しになったかたは、「たまたま」上記のような環境で
仕事をなさっているのかもしれませんし、そうではないのかもしれません。
なお、「実数 内部表現」あたりのキーワードでググってみると、
計算機の内部で実数をどのように保持しているかがわかって、
おもしろい(あるいは、大しておもしろくない)かもしれません。
浮動小数点数を保持する代表的な方式に「IEEE方式」があります。
この方式では、1.1 という数値が double 型で、sizeof(double)==8 だとすると、
その数値を保持するために 0x3ff199999999999a というビットパターンを持ちます。
このビットパターンを "%d" という int 型に対応する書式文字列で出力しようとするとき、
下位「sizeof(int)」バイトの分を出力し、それより上位の分は無視します。
sizeof(int)==4 だとすると、0x3ff199999999999a の下位 4 バイトは
0x9999999a となります。これは、十進数にすると -1717986918 です。
宿題をお出しになったかたは、「たまたま」上記のような環境で
仕事をなさっているのかもしれませんし、そうではないのかもしれません。
なお、「実数 内部表現」あたりのキーワードでググってみると、
計算機の内部で実数をどのように保持しているかがわかって、
おもしろい(あるいは、大しておもしろくない)かもしれません。