为什么我的i整数值错误?

问题描述

下面,我用简单的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。

相关问答

依赖报错 idea导入项目后依赖报错,解决方案:https://blog....
错误1:代码生成器依赖和mybatis依赖冲突 启动项目时报错如下...
错误1:gradle项目控制台输出为乱码 # 解决方案:https://bl...
错误还原:在查询的过程中,传入的workType为0时,该条件不起...
报错如下,gcc版本太低 ^ server.c:5346:31: 错误:‘struct...