将程序的实现中,我们经常会遇到将将字符串转换成数字的问题:
经常我们会用到atoi,atol,atoll。那无符号怎么办呢?下面的问题很严重。
所以无符号最好使用strtoul和strtoull等。
但是,下面介绍一个非常常见的问题,它会害死人的:
unsigned int value = 0;
value = (unsigned)atoi("3000000000");
printf("value = %u",value);
/*
在64位机器下,value=3000000000。然而在32位机器下value=2147483647
*/
这是因为atoi函数内部还是使用strtol实现的,那么,在atoi内部首先是strtol将"3000000000"转换成long类型,
然而,
在64位机器下,long是8字节的,最高字节是符号位,数据位是7位。
而在32位机器下,long是4字节的,即和int类型是一样的,最高字节也是符号位,数据位也是3位。所以在strtol已经将"3000000000"转换时截断为2147483647。
如果我们使用strtoul,就将不会出现上面的问题。
下面我将把我们常用的转换函数贴出来: