参考自:http://taop.marchtea.com/01.03.html
下面是我实现的代码,如有不妥之处,望指正,谢谢!
顺便提一下:
const
int
INT_MAX = (
int
)((unsigned)~0 >> 1);
const
int
INT_MIN = -(
int
)((unsigned)~0 >> 1) - 1;
对0取反(得到0FFFF),然后强制转换为无符号型整数(这样移位才有意义,否则跟没有移位的结果一样,可以查看反汇编验证),再左移1位(这里对无符号整型操作,使得符号位为0,所以就得到7FFF,即有符号的最大值);
其实当你通过反汇编验证时,就应该发现计算机中存储的是一个数的补码(毕竟计算机中的运算时通过补码实现的),而补码只有一种0,最小负数为8000(这里都是通过两个字节来讲的)。
#includeconst int INT_MAX = (int)((unsigned)~0 >> 1);const int INT_MIN = -(int)((unsigned)~0 >> 1) - 1;int StrToInt(const char *str){ if (str == NULL) { printf("The string is null!"); exit(1); } int num = 0; if (str[0] != '-' && str[0] == '+' || (str[0] -'0' <=9 && str[0] - '0' >=0)) { for (int i = 0; str[i] != '\0'; ++i) { if (str[i] - '0' <= 9 && str[i] - '0' >= 0) { if (num > INT_MAX / 10 || (num == INT_MAX / 10 && (str[i] - '0') > INT_MAX % 10)) { num = INT_MAX; break; } else{ num *= 10; num += (str[i] - '0'); } } else{ printf("Having a wrong with input!"); exit(1); } } } else if (str[0] == '-'){ for (int i = 1; str[i] != '\0'; ++i) { if (str[i] - '0' <= 9 && str[i] - '0' >= 0) { if (num < INT_MIN / 10 || (num == INT_MIN / 10 && (str[i] - '0') > -(INT_MIN % 10))) { num = INT_MIN; break; } else{ num *= 10; num -= (str[i] - '0'); } } else{ printf("Having a wrong with input!"); exit(1); } } } else{ printf("It's wrong!"); exit(1); } return num;}