为什么我得到一个错误的 `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;
}