コードをこのように適応させると、必要な答えが得られます。あなたのコードは、ビットの順序が間違っている回答を生成する傾向があります。10 進数値 123、1234567890、12345678901234567 の徹底的なテストでは、問題なく動作することが示されています (Mac OS X 10.7.4 の G++ 4.7.1)。
#include <iostream>
#include<sstream>
using namespace std;
int main()
{
long long int answer;
long long dec;
string binNum;
cout<<"Enter the decimal to be converted:"<< endl;;
cin>>dec;
cout<<"The dec number is: "<<dec<<endl;
while(dec>0)
{
stringstream ss;
answer = dec%2;
dec=dec/2;
ss<<answer;
binNum.insert(0, ss.str());
// cout << "ss<<" << ss.str() << ">> bn<<" << binNum.c_str() << ">>" << endl;
}
cout<<"The binary of the given number is: " << binNum.c_str() << endl;
return 0;
}
テスト実行:
$ ./bd
Enter the decimal to be converted:
123
The dec number is: 123
The binary of the given number is: 1111011
$ ./bd
Enter the decimal to be converted:
1234567890
The dec number is: 1234567890
The binary of the given number is: 1001001100101100000001011010010
$ ./bd
Enter the decimal to be converted:
12345678901234567
The dec number is: 12345678901234567
The binary of the given number is: 101011110111000101010001011101011010110100101110000111
$ bc
bc 1.06
Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
obase=2
123
1111011
1234567890
1001001100101100000001011010010
12345678901234567
101011110111000101010001011101011010110100101110000111
$
これを 64 ビット マシンで可能な最大値でコンパイルすると、バイナリ値には何も表示されません。
$ bc 1.06
Copyright 1991-1994, 1997, 1998, 2000 Free Software Foundation, Inc.
This is free software with ABSOLUTELY NO WARRANTY.
For details type `warranty'.
2^63-1
9223372036854775807
quit
$ ./bd
Enter the decimal to be converted:
9223372036854775807
The dec number is: 9223372036854775807
The binary of the given number is: 111111111111111111111111111111111111111111111111111111111111111
$
表現できる最大値に大きな値を選択すると、すべての賭けが無効になります。から 0 が返されることがありますがcin >> dec;
、コードは 0 を適切に処理しません。
前奏曲
質問の元のコードは次のとおりです。
#include <iostream>
using namespace std;
int main()
{
int rem,i=1,sum=0;
long long int dec = 9223372036854775808; // = 2^63 9223372036854775807 = 2^63-1
cout<<"The dec number is"<<dec<<endl;
while(dec>0)
{
rem=dec%2;
sum=sum + (i*rem);
dec=dec/2;
i=i*10;
}
cout<<"The binary of the given number is:"<<sum<<endl;
return 0;
}
以前のコードのこの分析を行いました。
64ビット数値のすべてのビット位置に対して、プレーンint
変数に10を掛けています。i
おそらく 32 ビットの量であるとすれi
ば、未定義の動作である符号付き整数のオーバーフローが発生しています。128 ビットの量であったとしても、可能なすべての 64 ビット数 (2 63 -1i
など) を正確に処理するには十分な大きさではありません。