【问题标题】:Why is std::hex not printing as hexadecimal specially with char? [duplicate]为什么 std::hex 不特别用 char 打印为十六进制? [复制]
【发布时间】:2018-04-06 11:50:43
【问题描述】:

其实在Visual 2013下编译C++,std::hex(粘性操作符)的行为并不是我所期望的:

我正在尝试将 char 打印为其十六进制值,但我不得不掩盖或强制转换我的值以获得所需的行为。

所以我的问题不是怎么做,而是为什么。

char valueInChar = 0xc8; //decimal 200
std::cout << std::hex << valueInChar; //prints out ╚
std::cout << std::hex << (valueInChar & 0xFF); //prints out c8
std::cout << std::hex << int(valueInChar); //also prints out c8

这是 std 的可视化实现中的错误吗?我对std::ios::hex 感到困惑吗?

【问题讨论】:

  • 经过一番研究,我没有看到这个答案。我用std::hex搜索。
  • 据我所知,通过查看问题和副本中的答案:这是关于 std::hex 的使用。即使不是:核心问题本质上是相同的:“我如何将char 打印为十六进制?”
  • 我同意,但 Matteo 的回应更好地解决了我的审问,这更像是“为什么”而不是“我该怎么做……”。
  • 复制是不好的问题吗?否决是针对不好的问题或重复的问题?
  • 技术上?依靠。用鼠标将鼠标悬停在否决按钮上,你看到了什么? “这个问题没有显示任何研究努力;它不清楚或没有用。”有人可能会争辩说,如果存在重复项(特别是,如果可以很容易地找到它,并且使用与问题中存在的几乎相同的术语) - 提问者没有做足够的研究,这可能成为重复的原因.但是,如果您在问题本身中承认您的问题与问题 X 相似,然后继续解释为什么它与它不同:这是一种不同的情况。

标签: c++ std


【解决方案1】:

charoperator&lt;&lt; 重载按原样打印字符值,因此它们不会被格式化为整数(这会受到格式化标志的影响),而是作为字符。

带有屏蔽的行恰好起作用,因为几乎所有算术和按位运算符都将小整数(signed/unsignedcharshort)提升为“常规大小”的整数(int 或 @987654329 @,根据某些规则),因此您实际上是在为 int 调用 operator&lt;&lt;

要使其在没有屏蔽的情况下工作,只需向int 添加一个演员表。

std::cout << std::hex << int(valueInChar);

【讨论】:

  • 在其他情况下,我确实有一些未定义的行为,与流无关:short fullValue = ((short(valueHigh) &lt;&lt; 8) | short(valueLow)); 取决于 2 个字符值的来源......只有掩码解决了它,而不是转换为短...
  • @Sandburg 是的,因为left shifts on signed values are undefined behaviour:“如果您左移一个有符号数以影响符号位,则结果未定义。” - 所以你必须非常小心你的面具和班次。有符号数的右移也有其特殊性,这就是为什么最好只移动无符号整数。
猜你喜欢
  • 2020-11-25
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-02-14
  • 2018-06-09
  • 2014-05-21
  • 2012-11-12
  • 2014-10-14
相关资源
最近更新 更多