こんにちはゲストさん。会員登録(無料)して質問・回答してみよう!

解決済みの質問

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

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言語は多少やっていますが、バイナリやビットパターンなどの理解が浅いのでその辺りをわかりやすくお願いします。

投稿日時 - 2010-05-23 14:40:33

QNo.5915679

困ってます

質問者が選んだベストアンサー

どうやら「浮動小数点数」をご存じないようですね。
まずこちらをご覧ください。
http://ja.wikipedia.org/wiki/%E6%B5%AE%E5%8B%95%E5%B0%8F%E6%95%B0%E7%82%B9%E6%95%B0

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
です。

投稿日時 - 2010-05-24 22:09:37

お礼

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

投稿日時 - 2010-06-09 12:44:21

このQ&Aは役に立ちましたか?

4人が「このQ&Aが役に立った」と投票しています

回答(1)

あなたにオススメの質問