为何strtol()返回0x7fffffff而非预期的0xAABBCCDD?
问题原因解析
- 核心矛盾:
strtol是有符号长整型解析函数,而你期望解析的0xAABBCCDD超出了4字节有符号long的取值上限- 4字节有符号
long的最大值为0x7FFFFFFF(十进制2147483647) 0xAABBCCDD的二进制最高位为1,作为有符号数时属于负数范畴,但它的绝对值远大于LONG_MAX,触发了strtol的溢出处理机制
- 4字节有符号
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字节,完全可以容纳0xAABBCCDDlong long var = strtoll(number, &p, 16);
内容的提问来源于stack exchange,提问作者Squared
相关产品推荐
相关产品推荐

