使用strtol()给出错误输出的十六进制字符串转换
问题描述:
我有一种情况,我需要将十六进制字符串0x8aaaf200
转换为uint32_t
。我首先在本地机器上测试了它(Linux Debian盒)。使用strtol()给出错误输出的十六进制字符串转换
// str contains "0x8aaaf200"
uint32_t var = (uint32_t)strtol(str, NULL, 0);
printf("conversion: %x \n\n", var); // prints 8aaaf200
我然后跑它在不同的机器(基于Android),但让我吃惊,输出出来是7fffffff
。我认为这可能与不同机器上的uint32_t
大小有关。
有没有人有关于如何解决它的建议?我无法更改uin32_t
类型的用法,因为它是其他人编写的代码的一部分。
答
实际上,您将获得LONG_MAX(即2147483647或0x7FFFFFFF)作为返回值,当传递给strtol的值大于LONG_MAX时会发生这种情况。您应该使用无符号类型在您的机器上表示该号码。请使用函数strtoul()代替strtol。
在任何符合C99的编译器中,uint32_t'总是32位。但是正确的格式说明符是['PRIx32'](http://*.com/q/12936798/995714) –
尝试在转换后测试'errno'的值,它可能会提供一些线索。 –
@JoëlHechterrno说'Errno:数学结果不能代表' – Jake