/* 分析剩下的所有字符,并且每一个步都检查是否溢出。 如果遇到非字符,则循环退出:p[0] <'0' || p[0] > '9' 字符串分析完毕,则循环退出:plen >= slen */ while (plen < slen && p[0] >= '0' && p[0] <= '9') { if (v > (ULLONG_MAX / 10)) /* 先判断溢出,在累加。如果计算后再判断,这时候已经溢出掉了. */ return0; v *= 10;
if (v > (ULLONG_MAX - (p[0]-'0'))) /* 道理同上,这里我们可以借鉴:判断溢出的方式. */ return0; v += p[0]-'0';
p++; plen++; }
/* 还有字符没有处理完,到这里其实就是上面的while循环条件, p[0]不是0-9的数字 */ if (plen < slen) return0;
/* 转换为负数,并且要检查溢出 */ /* 整个转换都是使用unsigned long long 作为临时值,最后保存的结果是有符号的,需要转换为 * long long ,这样在赋值和负数转变时候需要做溢出判断。 */ if (negative) { if (v > ((unsignedlonglong)(-(LLONG_MIN+1))+1)) /* 溢出检查 */ return0; if (value != NULL) *value = -v; } else { if (v > LLONG_MAX) /* 溢出检查. */ return0; if (value != NULL) *value = v; } return1; }