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

フォーラム(掲示板)ルール
フォーラム(掲示板)ルールはこちら  ※コードを貼り付ける場合は [code][/code] で囲って下さい。詳しくはこちら
micheal

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

#1

投稿記事 by micheal » 18年前

情報処理で、

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

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

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

box

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

#2

投稿記事 by box » 18年前

1.1というdouble型の値を、計算機の内部で
どのように保持しているかはおわかりですか?

micheal

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

#3

投稿記事 by micheal » 18年前

すみません、あまりよく理解していません。

YuO

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

#4

投稿記事 by YuO » 18年前

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

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

micheal

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

#5

投稿記事 by micheal » 18年前

YuOさんありがとうございました。

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

box

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

#6

投稿記事 by box » 18年前

すでに解決済みのようですけれど…。

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

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

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

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

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

閉鎖

“C言語何でも質問掲示板” へ戻る