【问题标题】:Behavior of cout << hex with uint8 and uint16cout << hex 与 uint8 和 uint16 的行为
【发布时间】:2014-06-27 19:54:11
【问题描述】:

我注意到cout &lt;&lt; hex 给了我奇怪的结果,我找不到任何可以回答原因的地方。我正在做的只是将一些值分配给uint8_tuint16_t,然后尝试将它们写入标准输出。当我运行这个时:

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


【解决方案1】:

std::uint8_tunsigned char 的别名:

typedef unsigned char uint8_t;

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

你必须把它转换成一个整数:

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

【讨论】:

  • 当隐式转换足够时,尽量不要使用强制转换。
  • @BenVoigt 在这个表达式中可以实现隐式转换吗?
  • @BenVoigt + 的技巧很好,但在我看来,演员表表现出更清晰的意图,并且对于那些查看可能不知道技巧的代码的人来说,不会感到困惑。
  • @RetiredNinja:那么请随意使用0u + a,它显然必须产生至少与较大操作数(unsigned int)大小相同的结果。问题是,如果 a 的类型发生变化,加法运算符不会突然开始做一些愚蠢的事情,就像演员一样。
  • @kebs:假设您将变量更改为 unsigned long long a = 0x123456789abcdefULL;double a = 1.6; 现在强制转换将丢弃部分值,但一元或二元 + 将打印整个值。
【解决方案2】:

关于原因,其他答案是正确的。最简单的解决方法是:

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

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

它之所以有效,是因为操作数经过整数提升。

【讨论】:

  • C++ 总是让我感到惊讶
【解决方案3】:

uint8_tunsigned char 的别名。您实际上是在打印一个值为 0xab 的字符,这可能是一个无效字符,具体取决于您的编码。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2013-02-10
    • 1970-01-01
    • 2022-07-21
    • 2016-08-12
    • 2017-11-05
    • 2018-03-20
    • 1970-01-01
    • 2021-01-22
    相关资源
    最近更新 更多