C语言字符串转无符号int,字符串转有符号int

摘自:http://blog.163.com/xychenbaihu@yeah/blog/static/1322296552011631111739570/

字符串转换成数字,atoi、atol、atoll(都是带符号的类型)和strtol、strtoll(都是带符号的类型)和strtoul、strtoull(都是不带符号的类型)   

将程序的实现中,我们经常会遇到将将字符串转换成数字的问题:

经常我们会用到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,就将不会出现上面的问题。

 

下面我将把我们常用的转换函数贴出来:

               

C语言字符串转无符号int,字符串转有符号int_第1张图片

C语言字符串转无符号int,字符串转有符号int_第2张图片

C语言字符串转无符号int,字符串转有符号int_第3张图片

你可能感兴趣的:(C语言)