[C/C++]详解 INT_MAX 和 INT_MIN(含溢出问题)

定义

C/C++中常量 INT_MAX 和 INT_MIN 分别表示最大、最小整数,定义在头文件#include<limits.h>中。

#define INT_MAX 2147483647
#define INT_MIN (-INT_MAX - 1)
  • INT_MAX为 2^31-1 ,即 2147483647 ;
  • INT_MIN为 -2^31 , 即 2147483648 ;

因为int占4字节32位,根据二进制编码的规则,INT_MAX = 2^31-1,INT_MIN= -2^31。

在C/C++语言中,不能够直接使用-2147483648来代替最小负数,因为这不是一个数字,而是一个表达式。表达式的意思是对整数21473648取负,但是2147483648已经溢出了int的上限,所以定义为(-INT_MAX -1)。


使用的注意事项

  • 在使用INT_MAX和INT_MIN时,需要 #include<limits.h>;
  • 不能直接用-2147483648来表示INT_MIN,该表达式相当于给+2147483648取负值,会先产生整型溢出问题;

溢出问题

在c/c++中,int 类型的取值范围为 [ -2147483648, 2147483647] ,超过这个范围则会产生溢出问题。

  • 当发生上溢时,即 INT_MAX + N (N为任意正整数),先进行 INT_MAX + 1 = INT_MIN ,这时上溢问题就解决了,之后便是正常的加减法,即 INT_MIN 再加上剩余的数,其结果为 INT_MIN + N -1;
  • 当发生下溢时,即 INT_MIN - N (N为任意正整数),先进行 INT_MIN - 1 = INT_MAX ,这时下溢问题就解决了,之后便是正常的加减法,即 INT_MAX 再减去剩余的数,其结果为 INT_MAX - N +1;    
  • 多次溢出时,依次解决。例如 INT_MAX + 1 - 1 ,该表达式根据 + / - 运算符的左结合性,先会发生 INT_MAX + 1 = INT_MIN ,然后发生 INT_MIN - 1 = INT_MAX ,其结果就为 INT_MAX ,依次类推;

如何避免溢出问题出现 

[C/C++]中常量 INT_MAX 和 INT_MIN 分别表示最大、最小整数 。因为int占4字节32位,根据二进制编码的规则,INT_MAX = 2^31-1,INT_MIN= -2^31。C/C++中,所有超过该限值的数,都会出现溢出,出现 warning,但是并不会出现error。如果想表示的整数超过了该限值,可以使用长整型 long long 占8字节64位。


 INT_MAX 和 INT_MIN 的运算

C/C++ 语言中 int 类型是 32 位的,范围是 -2147483648 到 2147483647 。 

  • 最轻微的上溢是 INT_MAX + 1,结果是 INT_MIN
  • 最严重的上溢是 INT_MAX + INT_MAX,结果是 -2。
  • 最轻微的下溢是 INT_MIN - 1,结果是是 INT_MAX
  • 最严重的下溢是 INT_MIN + INT_MIN,结果是

leetcode 常考面试题 

7. 整数反转

class Solution {
public:
    int reverse(int x) 
    {
        // to_string 函数的主要作用是将  整形 转换为  字符串
          string s = to_string(x);
          int l = 0;
          // 考虑 负数
          if(s[l]=='-')
          {
              l++;
          }
          // 将 数据部分 进行反转
          std::reverse(s.begin()+l,s.end());
          // INT_MAX 和 INT_MIN  是C++内置的常量
          const int k1 = INT_MAX,k2 = INT_MIN;
          string t1 = to_string(k1),t2 = to_string(k2);
          if(s[0]=='-')
          {
            if(s.size()==t2.size() && s > t2)
            {
                return 0;
            }
          }
          else
          {
            if(s.size()==t1.size() && s > t1)
            {
                return 0;
            }
 
          }
             // stoi() 将字符串转换为  整形
           x = stoi(s);
           return x;
    }
};

参考文章:

 C++整型上下限INT_MAX INT_MIN及其运算

INT_MAX和INT_MIN的定义及使用(含溢出问题)

INT_MAX 和 INT_MIN是什么?它们的用途是什么?如何防止溢出?

<think>好的,我现在需要回答用户关于C++中不同数据类型的最大值最小值的问题,特别是像INT_MININT_MAX、SHRT_MIN这些宏的数值。首先,我得回忆一下C++中常用的数据类型及其对应的极值宏。 用户提到了INT_MININT_MAX,这些应该是整型的最小最大值。我记得在C++中,这些宏定义在<climits>头文件中,而浮点类型的宏比如FLT_MIN、FLT_MAX则在<cfloat>里。不过,用户可能更关心的是具体的数值,以及如何正确引用这些值。 接下来,我需要根据用户提供的引用内容来确认数值的正确性。引用1提到无符号整型的上限,比如UCHAR_MAX、UINT_MAX等,这对应到有符号的应该就是SCHAR_MIN、SCHAR_MAX之类的。引用2给出了浮点型的具体数值,比如FLT_MAX是3.402823466e+38F,FLT_MIN是1.175494351e-38F,这些需要准确无误地转述。引用3中的代码示例展示了如何使用numeric_limits来获取极值,这可能也是用户需要的信息,因为C++中除了宏还可以用模板类来获取这些值。 另外,用户还提到了LDBL_MINLDBL_MAX,也就是长双精度浮点的极值。引用4中的printf语句显示LDBL_MAX用%le格式输出,说明其数值可能非常大,具体数值可能需要查阅资料或引用中的内容。不过用户提供的引用2已经给出了部分浮点数的信息,但长双精度的可能需要补充。 需要注意的是,不同数据类型的取值范围依赖于编译器系统架构。例如,在32位64位系统中,int可能都是4字节,而long可能在WindowsLinux中有不同的长度。引用5提到long的长度不小于int,这可能导致在不同平台下,LONG_MINLONG_MAX的值会变化,这点需要向用户说明清楚。 现在需要将这些信息结构化,按照数据类型分类,分别列出整型、浮点型,以及无符号类型,并且说明获取这些值的两种方法:使用宏numeric_limits模板类。同时,要确保数值的准确性,比如INT_MAX通常是2147483647,对应32位有符号整型的最大值,而SHRT_MAX是32767等。对于浮点类型,FLT_MIN是正数的最小值,而不是最小的负数,这点需要明确,避免误解。 可能还需要提醒用户注意数据溢出类型转换的问题,比如当使用较小的数据类型存储超出范围的值时会发生什么。此外,用户可能对如何在实际代码中获取这些值感兴趣,所以提供示例代码会更好,比如引用3中的cout语句,或者使用numeric_limits的示例。 最后,生成相关问题时要围绕数据类型的范围、使用方法、注意事项以及相关编程技巧展开,确保问题覆盖用户可能感兴趣的扩展内容。</think>### C++ 数据类型最大值与最小值详解C++中,数据类型的极值可通过两种方式获取: 1. **宏定义**(需包头文件`<climits>`或`<cfloat>`) 2. **`std::numeric_limits`模板类**(需包头文件`<limits>`) #### 一、整型数据类型 | 类型 | 最小值宏 | 最大值宏 | 典型值范围 (32/64位系统) | |---------------|---------------|---------------|------------------------------| | `short` | `SHRT_MIN` | `SHRT_MAX` | $-32768$ 至 $32767$ | | `int` | `INT_MIN` | `INT_MAX` | $-2147483648$ 至 $2147483647$ | | `long` | `LONG_MIN` | `LONG_MAX` | $-2147483648$ 至 $2147483647$(Windows/Linux 32位) | | `long long` | `LLONG_MIN` | `LLONG_MAX` | $-9223372036854775808$ 至 $9223372036854775807$ | **代码示例**: ```cpp #include <iostream> #include <climits> using namespace std; cout << "INT_MAX: " << INT_MAX << endl; // 输出2147483647 cout << "SHRT_MIN: " << SHRT_MIN << endl; // 输出-32768 ``` #### 二、浮点型数据类型 | 类型 | 最小值宏(最小正数) | 最大值宏 | 典型值范围 (IEEE 754) | |---------------|----------------------|------------------|-------------------------------| | `float` | `FLT_MIN` | `FLT_MAX` | $1.175494351e-38$ 至 $3.402823466e+38$ [^2] | | `double` | `DBL_MIN` | `DBL_MAX` | $2.2250738585072014e-308$ 至 $1.7976931348623158e+308$ | | `long double` | `LDBL_MIN` | `LDBL_MAX` | $3.3621031431120935e-4932$ 至 $1.189731495357231765e+4932$ [^4] | **代码示例**: ```cpp #include <cfloat> cout << "FLT_MAX: " << FLT_MAX << endl; // 输出3.40282e+38 ``` #### 三、无符号整型 | 类型 | 最大值宏 | 范围 | |---------------|----------------|---------------| | `unsigned int`| `UINT_MAX` | $0$ 至 $4294967295$ [^1] | | `unsigned long`| `ULONG_MAX` | $0$ 至 $4294967295$ (32位系统) | --- ### 注意事项 1. **平台差异**:`long`在Windows 64位中为4字节,在Linux 64位中为8字节[^5] 2. **浮点精度**:`FLT_EPSILON`表示浮点数的机器精度($1.192092896e-07$) 3. **安全使用**:需警惕整型溢出(如`INT_MAX + 1`会导致未定义行为) ---
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值