以下所有讨论都是在sizeof(int)和sizeof(long int)都等于4的基础上进行的.
int和long int二者的范围是一致的,都是-2^31---2^31-1,能表示的最大值是0x7FFFFFFF; unsigned int和unsigned long int二者的范围也是一致的,都是0---2^32-1,能表示的最大值是0xFFFFFFFF; 假设一个输入字符串inputdata的合法值是0x0-0xFFFFFFFF,你需要检查输入数据的有效性,怎么办? 刚开始我用下面的这个方法: int a; a = atoi(inputdata); if(a<0x0 || a>0xFFFFFFFF) return BOOL_FALSE; 结果发现无论输入多大的值,检查都是成功的.后来追查原因,发现如果输入大于0x7FFFFFFF的值,a的值都是0x7FFFFFFF,当然不会超过0xFFFFFFFF了,没有达到检测的目的. 后来把a的定义改为unsigned int a,还是不行,原来atoi的函数原型是int atoi(const char *nptr); 再后来不用atoi了,改用sscanf,如下所示: unsigned int a; sscanf(inputdata, "%u", (unsigned int *)&a) ; if(a<0x0 || a>0xFFFFFFFF) return BOOL_FALSE; 可又有一个问题,如果输入超过0xFFFFFFFF的值,a的值都是0xFFFFFFFF,用a>0xFFFFFFFF来检查没有达到目的.如果用a>=0xFFFFFFFF 来检查似乎达到目的了,不过如果用户恰好输入0xFFFFFFFF这个值程序会认为输入非法,而我又想允许用户输入0xFFFFFFFF这个值,怎么办呢? 无奈之下,只好用了long long: (c99支持long long) long long a; a = atoll(inputdata); if(a<0x1 || a>0xFFFFFFFF) return BOOL_FALSE; 唉,终于可以了. |