为什么我得到一个错误的 `i` 整数值?
Why do i get a wrong value for `i` integer?
下面我有简单的 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;
}
99999999999999999
超出了 int
可以容纳的值范围。
这可能是因为您为 int 分配了一个超出其范围的值。
当您在其范围之外分配一个 int 时,行为是实现定义的。
一些编译器将高位截断为您分配给它的整数类型的宽度。
如果你真的想使用这么大的数字,可以使用范围更大的 long long
。
void gen_nums(){
long long i = 99999999999999999 ;
cout << i <<endl;
//for (i = 99999999999999999; i < 999999999999999999 ; i++ ){
// cout << i << endl;
// }
}
或者为了方便起见,您可以只使用 auto
void gen_nums(){
auto i = 99999999999999999 ;
cout << i <<endl;
//for (i = 99999999999999999; i < 999999999999999999 ; i++ ){
// cout << i << endl;
// }
}
您需要将您使用的整数格式 int
更改为 long long
格式,正如我所读,在某些实现中可以假定最大值为 9,223,372,036,854,775,807
.
你得到的int(99999999999999999) = 1569325055
的值是内部溢出的错误输出
您应该使用 int64 而不是 int,因为给定的数字超出了 int 范围
- _int8 nSmall; // 声明 8 位整数
- _int16 nMedium; // 声明 16 位整数
- _int32 nLarge; // 声明 32 位整数
- _int64 nHuge; // 声明 64 位整数
如此大的任意值不能保存在 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
的类型。由于体系结构可能不同,因此您的系统可能会有所不同。
另一方面,如果您想 do-it-yourself 并查看 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/
该错误的原因是 C++ 中的整数范围是 -2147483648 到 2147483647。因此您可以使用的最大数字是 2147483647。
数据类型“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;
}
下面我有简单的 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;
}
99999999999999999
超出了 int
可以容纳的值范围。
这可能是因为您为 int 分配了一个超出其范围的值。
当您在其范围之外分配一个 int 时,行为是实现定义的。
一些编译器将高位截断为您分配给它的整数类型的宽度。
如果你真的想使用这么大的数字,可以使用范围更大的 long long
。
void gen_nums(){
long long i = 99999999999999999 ;
cout << i <<endl;
//for (i = 99999999999999999; i < 999999999999999999 ; i++ ){
// cout << i << endl;
// }
}
或者为了方便起见,您可以只使用 auto
void gen_nums(){
auto i = 99999999999999999 ;
cout << i <<endl;
//for (i = 99999999999999999; i < 999999999999999999 ; i++ ){
// cout << i << endl;
// }
}
您需要将您使用的整数格式 int
更改为 long long
格式,正如我所读,在某些实现中可以假定最大值为 9,223,372,036,854,775,807
.
你得到的int(99999999999999999) = 1569325055
的值是内部溢出的错误输出
您应该使用 int64 而不是 int,因为给定的数字超出了 int 范围
- _int8 nSmall; // 声明 8 位整数
- _int16 nMedium; // 声明 16 位整数
- _int32 nLarge; // 声明 32 位整数
- _int64 nHuge; // 声明 64 位整数
如此大的任意值不能保存在 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
的类型。由于体系结构可能不同,因此您的系统可能会有所不同。
另一方面,如果您想 do-it-yourself 并查看 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/
该错误的原因是 C++ 中的整数范围是 -2147483648 到 2147483647。因此您可以使用的最大数字是 2147483647。
数据类型“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;
}