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

问题描述 投票:8回答:3

我注意到cout << hex给了我奇怪的结果,我无法找到解决原因的任何地方。我正在做的只是为uint8_tuint16_t分配一些值,然后尝试将它们写入stdout。当我运行这个:

uint8_t a = 0xab;
uint16_t b = 0x24de;
cout << hex << a << endl;
cout << hex << b << endl;

我得到了结果:

$./a.out

24de
$

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

c++ hex stdout
3个回答
15
投票

std::uint8_tunsigned char的化名:

typedef unsigned char uint8_t;

因此选择了带有char&的插入器的重载,并且编写了0xab的ASCII表示,这在技术上可能因操作系统而异,因为0xab在扩展ASCII的范围内。

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

std::cout << std::hex << static_cast<int>(a) << std::endl;

9
投票

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

cout << hex << +a << endl;

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

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


6
投票

uint8_tunsigned char的化名。您实际上是打印一个值为0xab的字符,根据您的编码,该字符可能是无效字符。

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

© www.soinside.com 2019 - 2024. All rights reserved.