c ++:得到一个奇怪的打印输出

时间:2012-11-02 18:42:33

标签: c++

这是我的代码:

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]

谢谢!

2 个答案:

答案 0 :(得分:2)

现在,在大多数常见平台上,intlong都是32位宽。您正在导致整数溢出,其中您计算的值超出了有符号32位整数中可表示的范围。

如果值不适合32位但适合63或64位,则可以使用long longunsigned long long(或固定宽度类型int64_t或{来自uint64_t的{​​1}}数据类型来存储结果。如果那些不够大,那么你需要使用更复杂的解决方案(例如GMP库具有任意大小的整数支持),但这只是作为最后的手段。

答案 1 :(得分: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;

二进制形式以这种方式打印出所有前导零,但还有其他方法可以跳过前导零。