问题描述
下面,我用简单的C ++代码生成长度为18的数字。当我调用gen_nums
函数时,i
等于1569325055
,就好像我分配给该数字一样i
变量太大了。
#include <iostream>
using namespace std;
void gen_nums(){
int i = 99999999999999999;
cout << i <<endl;
}
int main()
{
gen_nums();
return 0;
}
解决方法
可能是因为您要为int分配一个超出其范围的值。
当您在其范围之外分配int时,行为是由实现定义的。
某些编译器将高位截断为您要为其分配的整数类型的宽度。
如果您真的想使用这么大的数字,可以使用范围更大的long long
。
void gen_nums(){
long long i = 99999999999999999 ;
cout << i <<endl;
//for (i = 99999999999999999; i < 999999999999999999 ; i++ ){
// cout << i << endl;
// }
}
或者为了方便起见,您可以只使用自动
void gen_nums(){
auto i = 99999999999999999 ;
cout << i <<endl;
//for (i = 99999999999999999; i < 999999999999999999 ; i++ ){
// cout << i << endl;
// }
}
,
99999999999999999
超出了int
可以容纳的值范围。
这种任意大的值不能保存在4字节的整数数据类型中(如果使用的是64位计算机)。但是,如果您不确定哪种类型适合它,请借助auto
:
#include <iostream>
void getNums() {
// 'long int' after type deduction
auto i = 99999999999999999;
std::cout << i << std::endl;
}
int main(void) {
getNums();
return 0;
}
在我的情况下,i
被推导为long
类型。您的系统可能会有所不同,因为架构可能会有所不同。
另一方面,如果您想自己动手并看到4字节(即32位)整数可以容纳的最大数字,则可以使用limits
:
void getNums() {
// 4-bytes integer on 64-bit machine
// expands to 2,147,483,647 in my 64-bit system
auto i = std::numeric_limits<int>::max();
std::cout << i << std::endl;
}
最后,请考虑启用编译器警告。这会对您有很大帮助。
如果您想更好地理解,请参考Data Type Ranges。
,大多数整数的最大大小为+2147483647。您提供的数字太大,例如,应使用“ unsigned long long”。这是一个页面,其中包含c ++中数据类型的长度。它是德语,但我希望这不是问题。 http://www.mrknowing.com/2013/10/08/datentypen-in-c-wertebereich-und-speichergroesse/
,您需要将使用的整数格式int
更改为99999999999999999
格式,该整数格式在您以及所有其他实现中具有小于long long
的最大值。如我所读,在某些实现中可以假定9,223,372,036,854,775,807
的最大值。
您获得的int(99999999999999999) = 1569325055
值是内部溢出的错误输出。
数据类型“ int ”不能容纳该范围的值。
请尝试以下代码:使用“ long int”数据类型
#include <iostream>
using namespace std;
void gen_nums(){
long int i = 99999999999999999 ;
cout << i <<endl;
//for (i = 99999999999999999; i < 999999999999999999 ; i++ ){
// cout << i << endl;
// }
}
int main()
{
gen_nums();
return 0;
}
,
您应该使用int64而不是int,因为给出的数字超出int范围
- _int8 nSmall; //声明8位整数
- _int16 nMedium; //声明16位整数
- _int32 nLarge; //声明32位整数
- _int64 nHuge; //声明64位整数
该错误的原因是C ++中的整数范围是-2147483648至2147483647。因此,您可以使用的最大数字是2147483647。