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

在当今最常见的平台上,两者int都是long32 位宽。您正在导致整数溢出,其中您计算的值超出了带符号的 32 位整数可表示的范围。

如果值不适合 32 位但适合 63 或 64 位,则可以使用long longor unsigned long long(或固定宽度类型int64_tuint64_tfrom <stdint.h>)数据类型来存储结果。如果这些还不够大,那么您将需要使用更复杂的解决方案(例如,GMP 库支持任意大小的整数),但只能作为最后的手段。

于 2012-11-02T18:50:33.947 回答
1

看起来您正在尝试获取一个数字并打印出其二进制表示,首先将其转换为一种十进制编码的二进制。无需转换,数字已在内部存储为一堆 0 和 1。实际上,打印出来必须经过一些处理才能将其打印为十进制数。

以下是如何以几种不同的方式打印出数字:

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 回答