使用uint8和uint16的cout << hex的行为

tar*_*sh4 8 c++ hex stdout

我注意到这cout << hex给了我奇怪的结果,我无法找到解决原因的地方.什么我做的是简单地分配一些值,既uint8_tuint16_t,然后试图将它们写入标准输出.当我运行这个:

uint8_t a = 0xab;
uint16_t b = 0x24de;
cout << hex << a << endl;
cout << hex << b << endl;
Run Code Online (Sandbox Code Playgroud)

我得到了结果:

$./a.out

24de
$
Run Code Online (Sandbox Code Playgroud)

没有显示uint8_t的值.可能是什么导致了这个?我认为不会有一种类型的cout实现而不是另一种类型.

0x4*_*2D2 15

std::uint8_t是别名unsigned char:

typedef unsigned char uint8_t;
Run Code Online (Sandbox Code Playgroud)

因此char&选择了a的插入器的重载,并且0xab写入了ASCII表示,这在技术上可能因操作系统而异,就像0xab在扩展ASCII的范围内一样.

你必须将它强制转换为整数:

std::cout << std::hex << static_cast<int>(a) << std::endl;
Run Code Online (Sandbox Code Playgroud)

  • @BenVoigt使用`+`的技巧很不错,但在我看来,演员表现出更清晰的意图,并且对于那些看到可能不知道技巧的代码的人来说不那么容易混淆. (3认同)

Ben*_*igt 9

其他答案是正确的.最简单的解决方法是:

cout << hex << +a << endl;
Run Code Online (Sandbox Code Playgroud)

演示:http://ideone.com/ZHHAHX

它的工作原理是操作数经过整数提升.

  • C++ 永远不会让我感到惊讶 (3认同)

小智 6

uint8_t是别名unsigned char.您实际上是在打印带有值0xab的字符,根据您的编码,该字符可能是无效字符.

这可以通过将其转换为另一个整数类型,将其值预先转换为字符串或编写某种实现的包装类来解决std::ostream& operator<<(std::ostream&, const ClassName&).