アプリ版:「スタンプのみでお礼する」機能のリリースについて

C++のプログラムがわかりません。

#include<iostream>
using namespace std;

union bits{
bits(double n);
void show_bits();
double d;
unsigned char c[sizeof(double)];
};

bits::bits(double n)
{
d=n;
}

void bits::show_bits()
{
int i,j;
for(j=sizeof(double)-1;j>=0;j--){
for(i=128;i;i>>=1)
if(i&c[j]) cout<<"1"
else cout<<"0";
cout<<"\n";
}
}

int main()
{
bits ob(1991.829);
ob.show_bits();
return 0;
}

このプログラムはdouble値に含まれるバイナリビットパターンをバイト単位で表示しているらしいのですが、
バイト単位のビットパターン 7: 01000000
バイト単位のビットパターン 6: 10011111
バイト単位のビットパターン 5: 00011111
バイト単位のビットパターン 4: 01010000
バイト単位のビットパターン 3: 11100101
バイト単位のビットパターン 2: 01100000
バイト単位のビットパターン 1: 01000001
バイト単位のビットパターン 0: 10001001

にどうしてなるかわかりません。
1991.829をどのように区切ればこのような結果になるのでしょうか?
C言語は多少やっていますが、バイナリやビットパターンなどの理解が浅いのでその辺りをわかりやすくお願いします。

A 回答 (1件)

どうやら「浮動小数点数」をご存じないようですね。


まずこちらをご覧ください。
http://ja.wikipedia.org/wiki/%E6%B5%AE%E5%8B%95% …

1991.829の場合で言うと、
まずこの数値を2進数に直しますと、
11111000111.110101000011100101011000000100000110001001…
となります。中途半端な数なので循環小数になってしまっています。(悪問ですね。)
続いて、小数点の位置を見ます。
1 . 1111000111110101000011100101011000000100000110001001…
ここを基準として、10桁ずれたところにあります。この10は後で使うので覚えておきます。
次に、二進数には数字が1と0しかないので、最上位の数字は0でないので常に1です。
常に同じなら書く必要はないのでとってしまいます。
1111000111110101000011100101011000000100000110001001
一方、先ほどの10ですが、これを指数と呼びます。
説明は面倒なので割愛しますが、double型ではこれに1023を足した数値を記録することになっています。
10+1023(10進数)
=00000001010+01111111111=10000001001(二進数)
です。
最後に符号をつけます。プラスなら0、マイナスなら1です。
合わせて、
0 10000001001 1111000111110101000011100101011000000100000110001001
となり、8ビットで区切れば、
01000000
10011111
00011111
01010000
11100101
01100000
01000001
10001001
です。
    • good
    • 0
この回答へのお礼

お礼が遅れましたが、ご回答ありがとうございました。
すごくわかりやすい説明で納得できました。
(double型では1023を足すってのは多分約束事ですよね?)

お礼日時:2010/06/09 12:44

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