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言語は多少やっていますが、バイナリやビットパターンなどの理解が浅いのでその辺りをわかりやすくお願いします。
No.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
です。
お礼が遅れましたが、ご回答ありがとうございました。
すごくわかりやすい説明で納得できました。
(double型では1023を足すってのは多分約束事ですよね?)
お探しのQ&Aが見つからない時は、教えて!gooで質問しましょう!
似たような質問が見つかりました
- C言語・C++・C# C++のcinの動作 5 2023/02/26 00:13
- C言語・C++・C# Cのdoubleの浮動小数点表示について 3 2023/04/17 13:14
- 電車・路線・地下鉄 ITパスポート試験問題 7 2023/01/25 09:51
- C言語・C++・C# c言語でユーザ関数を利用して複素数のべき乗と絶対値の数列を計算するプログラムが作りたいです。 3 2023/01/29 22:13
- C言語・C++・C# C 言語の Gauss Jordan 法について 2 2022/12/28 11:16
- C言語・C++・C# C言語のエラーについて 2 2022/07/11 13:56
- C言語・C++・C# バイナリファイルをコピーするのにかかる時間を測りたいのですが実行するとFatel error:gli 2 2022/11/03 01:10
- C言語・C++・C# C++初心者です stirng 2 2022/09/20 20:43
- Oracle ビットで表せる数値について 3 2022/09/12 16:37
- 情報処理技術者・Microsoft認定資格 情報技術の問題についてです。 10進数の−36を以下のような16ビットの浮動小数点表示にするといくつ 3 2022/05/21 19:53
おすすめ情報
デイリーランキングこのカテゴリの人気デイリーQ&Aランキング
-
シーケンサー入力で装置でよく...
-
断り方を教えてください! 仮想...
-
社会現象と社会問題の違いはな...
-
24ビット フルカラー表示(167...
-
ビットフライヤーで、トランザ...
-
解像度につく「16bit」とか「...
-
仮想通貨、クイックリバースと...
-
仮想通貨を積み立て投資したい...
-
ブロックチェーン技術を応用し...
-
トリマ ルーターのおすすめビ...
-
今から仮想通貨買うのは遅いで...
-
Coinbaseの撤退とWalletについて
-
確定申告を控えビットバンクの...
-
ビットコイン(仮想通貨)を無料...
-
Rtx3080でマイニングしているも...
-
仮想通貨 仮想通貨で2億稼いだ...
-
リノコインっていう仮想通貨?...
-
仮想通貨のコインイクスチェン...
-
いま、仮想通貨と言うのがあり...
-
大学生のものです。テレビで話...
マンスリーランキングこのカテゴリの人気マンスリーQ&Aランキング
-
シーケンサー入力で装置でよく...
-
旦那が江戸バースという仮想通...
-
仮想通貨、クイックリバースと...
-
24ビット フルカラー表示(167...
-
ドリルビットの取り外し方
-
RS232のボーレートと転送周期に...
-
ビットコインについて教えてく...
-
社会現象と社会問題の違いはな...
-
断り方を教えてください! 仮想...
-
彼女について。 最近お付き合い...
-
Coinbaseの撤退とWalletについて
-
解像度につく「16bit」とか「...
-
RS-232C ボーレートの許容誤差
-
仮想通貨に投資して、凄く得し...
-
仮想通貨で800万円ほど溶かしま...
-
今から仮想通貨買うのは遅いで...
-
100MB/s?
-
仮想通貨 仮想通貨で日本でも有...
-
ルーターでボース面のビットを...
-
今のパソコンのCPUって、何ビッ...
おすすめ情報