C++ 十六进制字符串转无符号整数

6
可能重复:

参考:
C++ 将十六进制字符串转换为有符号整数

我正在尝试将一个十六进制字符串转换为无符号整数。我的代码如下:

string hex("FFFF0000");
UINT decimalValue;
sscanf(hex.c_str(), "%x", &decimalValue); 
printf("\nstring=%s, decimalValue=%d",hex.c_str(),decimalValue);

结果是-65536。我通常不做太多的C++编程,所以任何帮助都将不胜感激。
谢谢, Jeff

5个回答

25
你可以使用 istringstreamhex 操纵器来完成这个任务:
#include <sstream>
#include <iomanip>

std::istringstream converter("FFFF0000");
unsigned int value;
converter >> std::hex >> value;

你还可以使用 std::oct 操纵符来解析八进制数值。

我认为你得到负数的原因是你正在使用有符号值的 %d 格式说明符。使用无符号值的 %u 应该可以解决这个问题。不过更好的方法是使用流库,它在编译时就可以解决这个问题:

std::cout << value << std::endl; // Knows 'value' is unsigned.

有人知道如果数字不是有效的十六进制会发生什么吗?我刚试了一些字母,例如0xG,但我没有捕获到异常? - gbmhunter
@gbmhunter 这将导致流进入失败状态,这不一定会触发异常,除非您已启用它们。您可能想要了解有关failbit和流故障的信息。 - templatetypedef

6

使用%u代替%d输出整数。


4

好的,-65536是0xFFFF0000。如果您要使用

printf("\nstring=%s, decimalValue=%u",hex.c_str(),decimalValue);

它会打印出你期望的内容。


3

%d将UINT的位解释为有符号数。您需要:

printf("\nstring=%s, decimalValue=%u",hex.c_str(),decimalValue);

3
答案是正确的,如果将0xffff0000解释为有符号数(使用%d格式化输出),则其值为-65536。你需要将十六进制数解释为无符号数(使用%u或%x格式化输出)。

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接