INT_MAX和INT_MIN的定义及使用(含溢出问题)
定义
C/C++中的 <limits.h> 头文件中定义:
#define INT_MAX 2147483647
#define INT_MIN (-INT_MAX - 1)
- INT_MAX为 2^31-1 ,即 2147483647 ;
- INT_MIN为 -2^31 , 即 2147483648 ;
使用的注意事项
- 在使用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 ,依次类推;