【问题标题】:printing negative value in C++ base 8 or 16在 C++ 中以 8 或 16 为基数打印负值
【发布时间】:2011-09-10 18:34:51
【问题描述】:

C++ 应该如何以 8 或 16 为基数打印负值?我知道我可以尝试我当前的编译器/库所做的事情(它打印位模式,前面没有减号)但我想知道应该做什么,最好有参考。

【问题讨论】:

标签: c++


【解决方案1】:

似乎没有一个标准输出工具支持非小数的有符号格式。因此,请尝试以下解决方法:

struct signprint
{
  int n;
  signprint(int m) : n(m) { }
};

std::ostream & operator<<(std::ostream & o, const signprint & s)
{
  if (s.n < 0) return o << "-" << -s.n;
  return o << s.n;
}

std::cout << std::hex << signprint(-50) << std::endl;

您可以根据需要在适当的位置插入0x

【讨论】:

  • 谢谢,但我不是在寻找解决方案!事实上,我已经编写了自己的 ostream 等价物,当我在 ostream 上对其进行测试时,它在以非十进制为基数打印负数时表现不同。顺便说一句,我认为您的解决方案在打印 MININT 时会遇到麻烦,它不能转换为正数...
  • 是的,很有趣 - 这可能需要单独的检查,以及用于打印的无符号类型......关于这个问题,我只是认为你不能使用标准的 C 或 C++ 格式化工具来做到这一点。跨度>
  • 再一次,我没有问如何以非 10 基数打印负数,我问的是图书馆应该做什么
【解决方案2】:

从 n1905 的 §22.2.2.2.2(是的,真的)开始,使用 ios_base::hex 等效于 stdio 格式说明符 %x%X

从 n1570 的 §7.21.6.1 开始,%x 说明符将其参数解释为无符号整数。

(是的,我意识到这些标准文档的选择很古怪。我相信如果你足够努力的话,你可以在你最喜欢的副本中找到文本。)

【讨论】:

  • Oli 给出了基本相同的答案,但在评论中,所以我不能投票给他!
猜你喜欢
  • 2018-06-30
  • 2022-10-26
  • 2019-11-08
  • 1970-01-01
  • 2021-02-05
  • 2020-09-20
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多