int,long int, unsigned int,unsigned long int,long long的表示范围问题(转)

 

以下所有讨论都是在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;

唉,终于可以了.

  • 1
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值