【问题标题】:C++ hex string to unsigned int [duplicate]C ++十六进制字符串到无符号整数[重复]
【发布时间】: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++ 编程,因此我们将不胜感激。

谢谢, 杰夫

【问题讨论】:

标签: c++ hex int


【解决方案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);
        

        【讨论】:

          猜你喜欢
          • 2021-03-07
          • 1970-01-01
          • 2023-04-11
          • 2013-09-06
          • 2014-10-19
          • 2017-08-07
          • 1970-01-01
          • 2015-03-09
          • 2017-08-12
          相关资源
          最近更新 更多