如何理解atoi、atol、strtol在32位系统64位系统上的区别



工作中遇到的一个问题,分析uint uiIndex = atoi(aucNum)是否存在问题;
这就要分析atoi转换后可能出现什么值,以及运行在32位系统与64位系统是否会有区别。

通过man atoi函数了解到atoi函数实际调用的strtol函数。

即函数在转换过程中存储的值都是long型的值,即返回long型后强制转换成int型。
此时就要分析long型所能表示的范围了。
long型32位下与int型相同,即转换后的结果与int型结果的范围一致即2147483647~-2147483648,如果入参超过这个的范围则返回这个值的边界值,正数返回2147483647负数返回-2147483648
long型64位下占8个字节,所以此时能够存储的最大返回就是
9223372036854775807~-9223372036854775808,所以即使超过int型的最大长度,也能存储,此时就会直接进行long型到int型的强制转换,发生截断,舍弃高32bit的数据,而不保留符号位(符号位是最高bit)
如转换后是0x7fffffffffffffff,是一个正数,截断后就变成 0xffffffff = -1

strtol函数能够指定入参的类型是0-36进制的数,即如果入参是十六进制的字符串可以用此函数转换。
strtoll 返回结果是longlong型
strtoul如果入参字符串的范围是一个ulong范围的值,则可以使用此函数转换。转换结果范围为0~0xffffffff (32bit)或0~0xffffffffffffffff(64bit)
所以在编程时一定要区分好32位和64位系统,且要保证字符串的实际范围与所调用的函数能表示的范围一致,否则出现截断的话,则可能出现非预期的结果。

总结:工作中如果遇到不明白如何使用的时候,首先要通过man 手册分析,通过实际的测试找到答案,不要盲目的查百度这样能够加深记忆与理解。

你可能感兴趣的:(Linux编程)