如何理解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 手册分析,通过实际的测试找到答案,不要盲目的查百度这样能够加深记忆与理解。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值