C ++十六进制字符串到无符号整数[重复]

Posted

技术标签:

【中文标题】C ++十六进制字符串到无符号整数[重复]【英文标题】:C++ hex string to unsigned int [duplicate] 【发布时间】:2011-06-15 15:04:12 【问题描述】:

可能重复:C++ convert hex string to signed integer

我正在尝试将十六进制字符串转换为 C++ 中的无符号整数。我的代码如下所示:

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

结果是 -65536。我通常不会做太多 C++ 编程,因此我们将不胜感激。

谢谢, 杰夫

【问题讨论】:

另见Convert hexadecimal string with leading “0x” to signed short in C++? 【参考方案1】:

您可以使用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 这将导致流进入失败状态,除非您启用它们,否则不一定会触发异常。您可能想了解failbit 和流失败。【参考方案2】:

%u 代替%d 输出int

【讨论】:

【参考方案3】:

嗯,-65536 是 0xFFFF0000。如果你会使用

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

它会打印出你所期望的。

【讨论】:

【参考方案4】:

答案是正确的,0xffff0000 如果解释为有符号(%d printf 格式化程序),则为 -65536。您希望将您的十六进制数解释为无符号(%u 或 %x)。

【讨论】:

【参考方案5】:

%d 将 UINT 的位解释为带符号的。你需要:

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

【讨论】:

以上是关于C ++十六进制字符串到无符号整数[重复]的主要内容,如果未能解决你的问题,请参考以下文章

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

怎样用C语言将字符转化成十六进制整数

C中的无符号十六进制常量?

C语言转换格式符大全?

c语言如何让输出结果精确到两位小数

NSLog()输出函数集格式字符