質問: VC C++です。 double型で「1.1」と記録しました。 すると、16進数で、「9A 99 99 99 99 99 F1 3F」となっていました。 何故そうなるのか説明お願いします。
回答: 一言で言うと「IEEE754の倍精度浮動小数点形式で数値を表現しているから」です。 実際にやってみます。 1.1をIEEE754倍精度浮動小数点数に変換する。 http://www.pat.hi-ho.ne.jp/ochiyasu/jouhou/2syu/jou-2-n_sinsu.ht... の一番上にある方法で0.1(10進数)=0.000110011001100110011001....(以下ずっと1001が続く)と計算されるので 1.1(10進数) = 1.0001 1001 1001 1001 1001 1001 1001 1001 ... これをIEEE754の形式にあわせると 符号は正なので0 指数部(2^n乗)のところがn=0なのでお約束で1023と表現する。1023(10進数)=3FF(16進数)=0011 1111 1111 仮数部は上のとおりで、1を省略して小数点以下だけを格納する方式なのであわせると 0011 1111 1111 0001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1001 1010 3 F F 1 9 9 9 9 9 9 9 9 9 9 9 A 最後の1ビットは最近偶数丸めと呼ばれるやり方でで切り上げて9->Aとします。 これは 3F F1 99 99 99 99 99 9A です。 ここでIntel系のCPU(x86)はリトルエンディアン形式で数値を格納するので、バイトの順が入れ替わります。 http://www.wdic.org/w/TECH/%E3%83%AA%E3%83%88%E3%83%AB%E3%82%A8%... 逆に読めばいいので 9A 99 99 99 99 99 F1 3A と格納される、というわけです。