1

それが私のコードです:

long base2(int number)
{
   long result = 0;
   int num = number;
   int multi = 1;
   int rem;
   while(num > 0)
   {
    rem = num % 2;
    result = result + (rem * multi);
    num = num / 2;
    multi = multi * 10;
   }
   return result;
}

私は奇妙な印刷物を手に入れています:-1884801888

デバッガーとその計算を適切に実行しましたが、最後に最終的な答えがこれに変わります-1884801888

[印刷はメインで行われます、私はチェックしました、数はここでに変わります-1884801888]

ありがとうございました!

4

2 に答える 2

2

最近のほとんどの一般的なプラットフォームでは、 と の両方intlong32 ビット幅です。計算している値が符号付き 32 ビット整数で表現できる範囲を超えている場合、整数オーバーフローが発生しています。

値が 32 ビットに収まらず、63 ビットまたは 64 ビットに収まる場合は、long longまたはunsigned long long(または固定幅型int64_tまたはuint64_tfrom <stdint.h>) データ型を使用して結果を格納できます。それらが十分に大きくない場合は、より複雑な解決策を使用する必要があります (たとえば、GMP ライブラリは任意のサイズの整数をサポートしています) が、それは最後の手段としてのみ行います。

于 2012-11-02T18:50:33.947 に答える
1

最初に一種の10進数コード化バイナリに変換することにより、数値を取得してそのバイナリ表現を出力しようとしているようです。変換する必要はありません。数値はすでに内部で0と1の束として格納されています。実際、10進数として印刷するには、印刷に何らかの処理を行う必要があります。

いくつかの異なる方法で数値を印刷する方法は次のとおりです。

const int foo = 17;
std::bitset<sizeof(foo)*8> b(foo);

std::cout << "Decimal:  " << foo
          << "\nHex:      " << std::hex << foo
          << "\nOctal:    " << std::oct << foo
          << "\nBinary:   " << b << std::endl;

バイナリ形式は、この方法ですべての先行ゼロを出力しますが、先行ゼロをスキップする他の方法があります。

于 2012-11-02T19:05:39.383 に答える