You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

为何strtol()返回0x7fffffff而非预期的0xAABBCCDD?

问题原因解析
  • 核心矛盾:strtol是有符号长整型解析函数,而你期望解析的0xAABBCCDD超出了4字节有符号long的取值上限
    • 4字节有符号long的最大值为0x7FFFFFFF(十进制2147483647)
    • 0xAABBCCDD的二进制最高位为1,作为有符号数时属于负数范畴,但它的绝对值远大于LONG_MAX,触发了strtol的溢出处理机制
  • strtol的溢出行为:当解析数值超出LONG_MAX或低于LONG_MIN时,函数会返回LONG_MAX(即0x7FFFFFFF),同时将errno设置为ERANGE,这就是你看到的返回值和perror提示“Result too large”的原因
  • 关于"AABBCC EEFF"正常解析:0xAABBCC(十进制11184812)远小于0x7FFFFFFF,处于有符号long的有效范围内,因此不会触发溢出
可行解决方案
  • 若需解析无符号32位值:改用strtoul(无符号长整型解析函数),它的取值范围覆盖0到0xFFFFFFFF,能正确解析0xAABBCCDD,之后可强制转换为long(此时long内存存储值为0xAABBCCDD,但作为有符号数会显示为负数-1430532805)
    unsigned long var_unsigned = strtoul(number, &p, 16);
    long var = static_cast<long>(var_unsigned);
    
  • 若需保留有符号语义:改用strtoll(64位有符号长整型解析函数),MSVC中long long为8字节,完全可以容纳0xAABBCCDD
    long long var = strtoll(number, &p, 16);
    

内容的提问来源于stack exchange,提问作者Squared

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.20 00:43:20