今天在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),那就说明它溢出了。
新闻热点
疑难解答