今天在leetcode上做题时,又遇到了与数据溢出相关的内容,在此记录下吧。
在头文件“limits.h”中有各种基本数据类型的最大最小值。
/* Minimum and maximum values a `signed int' can hold. */
# define INT_MIN (-INT_MAX - 1)
# define INT_MAX 2147483647
/* Maximum value an `unsigned int' can hold. (Minimum is 0.) */
# define UINT_MAX 4294967295U
/* Minimum and maximum values a `signed long int' can hold. */
# if __WORDSIZE == 64
# define LONG_MAX 9223372036854775807L
# else
# define LONG_MAX 2147483647L
# endif
# define LONG_MIN (-LONG_MAX - 1L)
/* Maximum value an `unsigned long int' can hold. (Minimum is 0.) */
# if __WORDSIZE == 64
# define ULONG_MAX 18446744073709551615UL
# else
# define ULONG_MAX 4294967295UL
# endif
# ifdef __USE_ISOC99
/* Minimum and maximum values a `signed long long int' can hold. */
# define LLONG_MAX 9223372036854775807LL
# define LLONG_MIN (-LLONG_MAX - 1LL)
/* Maximum value an `unsigned long long int' can hold. (Minimum is 0.) */
# define ULLONG_MAX 18446744073709551615ULL
# else
# define ULONG_MAX 4294967295UL
# endif
举例,将一个string转换为int。
//64位
# define INT_MIN (-INT_MAX - 1)
# define INT_MAX 2147483647
这是leetcode上的一道题目,将string转换为int。
class Solution {
public:
int myAtoi(string str) {
int sum = 0;
bool flag = true;
for (int j=0; j<str.size(); ) {
if (str[j]==' ') {
str.erase(j, 1);
j = 0;
} else {
break;
}
}
//是否为负数
bool negative = str[0] == '-' ? true : false;
int i = str[0] == '-' || str[0] == '+' ? 1 : 0;
while (isdigit(str[i])) {
//判断是否溢出
if (sum > INT_MAX / 10 || (sum == INT_MAX / 10 && str[i] - '0' > 7)) {
if (negative)
return INT_MIN;
else
return INT_MAX;
}
sum = sum * 10 + (str[i++] - '0');
}
return negative ? -sum : sum;
}
};
判断的方法是,如果一个int类型的数值的绝对值已经大于“INT_MAX / 10”,或者它等于“INT_MAX / 10”但是其下一个将要相加的数字大于了7(因为IN_MAX=2147483647),那就说明它溢出了。