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】:您可以使用istringstream
和hex
操纵器来做到这一点:
#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 ++十六进制字符串到无符号整数[重复]的主要内容,如果未能解决你的问题,请参考以下文章