为什么我会得到两个不同的结果? 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
答案 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;
}
答案 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_t
和uint64_t
分别代替unsigned long
和unsigned long long
。 u
表示该数字是无符号的(如果省略u
,则假定该数字已签名)。数字(在这种情况下为64
和32
)表示该数字应该有多少字节。最后_t
表示这是一种数据类型。所以(u)int#_t
是编写数字数据类型的常用方法;标准C ++中的#
可以是8,16,32或64,具体取决于您需要的位数。
总结一下:你正在抛出一个在函数上太大的数字。您需要更改函数的参数以支持此数字:
void Print(uint64_t num){
cout << dec << num << endl;
}