【问题标题】:Printing hex characters打印十六进制字符
【发布时间】:2020-02-01 15:35:13
【问题描述】:

我想了解打印出一个 char 和一个 unsigned char 的结果。

#include <iostream>
#include <string>

using namespace std;

int main()
{
    int8_t a = 0xA1;
    uint8_t b = 0xA1;
    printf("0x%x,", a);
    printf("0x%x,", b);
    std::cout << std::hex << a << ",";
    std::cout << std::hex << b << std::endl;
}

结果

0xffffffa1,0xa1,�,� 

我不明白为什么 signed char 会变成 uint 或 int,为什么 std::hex 会惨败。

【问题讨论】:

标签: c++


【解决方案1】:

int8_t a = 0xA1; 导致有符号溢出,因此行为未定义。如果你打开了正确的编译器标志,你会get 类似:

error: overflow in conversion from 'int' to 'int8_t' {aka 'signed char'} changes value from '161' to '-95' [-Werror=overflow]

    8 |     int8_t a = 0xA1;

      |                ^~~~

此外,%x 需要 unsigned int。这也会导致未定义的行为。你的意思是:

#include <iostream>

int main()
{
    int8_t a = 42; // Doesnt overflow
    uint8_t b = 42;
    std::printf("%#x,", static_cast<unsigned int>(a));
    std::printf("%#x,", static_cast<unsigned int>(b));
    std::cout << std::hex << static_cast<unsigned int>(a) << ",";
    std::cout << std::hex << static_cast<unsigned int>(b) << std::endl;
}

输出:0x2a,0x2a,2a,2a

【讨论】:

  • 哎呀。我真的需要开始记住十六进制值,因为我认为 A1 要小得多。谢谢。
猜你喜欢
  • 1970-01-01
  • 2011-12-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-09-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多