定义
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 常考面试题
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;
}
};
参考文章: