为什么这段代码不能正常打印数字?

时间:2014-12-15 18:03:33

标签: c++

为什么我会得到两个不同的结果? unsigned long足以处理这样的数字,它不能是某种溢出的权利吗? 我故意试图让它以十进制形式显示!但它不起作用。
是什么原因?

#include <iostream>
using namespace std;
void Print(unsigned long num)
{
    cout<<dec<<num<<endl;
}
int main() 
{
    Print(9110865112);  
    cout<<dec<<9110865112;
    return 0;
}

修改
它输出:

520930520
9110865112

3 个答案:

答案 0 :(得分:8)

unsigned long并不总是足够大。对于32位,它可以占用从0到2并且包括2 32 -1的整数,这大约是40亿。 9'110'865'112是九十亿,因此不适合unsigned long

尝试输出sizeof unsigned long,看看你得到了什么。

另外,请考虑您的输出:9110865112 mod 2 32 520930520,这基本上证明您的计算机上unsigned long大32位。

答案 1 :(得分:3)

问题是您指定的数字文字太大而无法放入无符号长整数。

当您直接使用文字时,编译器会将其视为long long,并为operator <<选择适当的重载。

要解决此问题,请在unsigned long long功能的签名中使用Print

void Print(unsigned long long num)
{
    cout<<dec<<num<<endl;
}

Demo.

答案 2 :(得分:1)

因为9,110,865,112大于32位,所以即使您尝试传递更多位,该方法也仅接受32位。

要解决此问题,您应该为unsigned long long参数使用num数据类型。当你直接打印它作为常量打印时,代码打印出find,因为编译器说常量是unsigned long long,但是当你将它作为unsigned long传递时,编译器说该常量应该是unsigned long。因为它不是unsigned long,所以会丢掉一些比特。 (我很惊讶你的编译器没有打印出警告。)

作为参考,unsigned long可以保存0到4,294,967,295(含)之间的值。应该为任何大于此值的值分配更大的数据类型。 unsigned long long可以保存0到18,446,744,073,709,551,615(含)之间的值。

值得注意的是,经常使用数据类型uint32_tuint64_t分别代替unsigned longunsigned long longu表示该数字是无符号的(如果省略u,则假定该数字已签名)。数字(在这种情况下为6432)表示该数字应该有多少字节。最后_t表示这是一种数据类型。所以(u)int#_t是编写数字数据类型的常用方法;标准C ++中的#可以是8,16,32或64,具体取决于您需要的位数。

总结一下:你正在抛出一个在函数上太大的数字。您需要更改函数的参数以支持此数字:

void Print(uint64_t num){
    cout << dec << num << endl;
}