这是我的代码:
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
]
谢谢!
答案 0 :(得分:2)
现在,在大多数常见平台上,int
和long
都是32位宽。您正在导致整数溢出,其中您计算的值超出了有符号32位整数中可表示的范围。
如果值不适合32位但适合63或64位,则可以使用long long
或unsigned 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;
二进制形式以这种方式打印出所有前导零,但还有其他方法可以跳过前导零。