【问题标题】:why we can't print the value in binary form like decimal, octal, hexadecimal form? [duplicate]为什么我们不能以十进制、八进制、十六进制等二进制形式打印值? [复制]
【发布时间】:2018-06-09 02:05:00
【问题描述】:

为什么我们不能像在 C 编程中那样打印二进制数字。

例子:

int a=9;  
printf("%b",a);   

就像我们可以用其他形式打印一样:

  • 八进制printf("%o",a);
  • 十进制printf("%d",a);
  • 十六进制printf("%x",a);

【问题讨论】:

  • 嗯,不是C语言,是printf实现的缺点。
  • @Vitthal 这是两个标准的缺点。
  • 在c++中,可以使用bitsetcout
  • @underscore_d:所以 OP 可能想知道包括某些格式和排除其他格式的历史原因?
  • @Vitthal 没有特别的原因。 printf 函数的最初设计者认为包含它不够重要。

标签: c printf


【解决方案1】:

这与 C 语言本身无关。只是,默认情况下,C 标准没有为printf() 和family 指定格式说明符来生成二进制表示输出。

您始终可以推出自己的功能来完成工作。有一些版本的 C 库选择提供格式说明符(以及整数后缀)来表示二进制表示,但同样,这既不是强制性的,也不是由官方标准规定的。

【讨论】:

  • 这句话“这与 C 语言本身无关”是错误的。 C 标准还描述了标准函数。
  • 根据问题标题,“为什么我们不能以十进制、八进制、十六进制等二进制形式打印值?”......好吧,我们可以。这就是上下文。
  • @Vlad:将二进制格式说明符添加到printf 的现有实现并编译您自己的stdlib 是完全有效的。 语言中没有任何东西能阻止这一点——它仍然是完美的标准C。
  • @VladfromMoscow:有时这是必要的 ?...但是 OP 提出了一个幼稚且模棱两可的问题! “为什么不能我们...”两个可能的答案是:因为 Printf 不这样做(根据 printf 标准),或者“但是你可以”(因为 C 可以)。跨度>
  • 我认为他们谈论的不是重新定义标准函数,而是编写一个自定义库来扩展其 printf() 的功能。这可以实现所有标准说明符都按预期工作的结果,但 %b 是作为扩展添加的。当然,可以说现在%b 的行为不像在严格符合printf() 中那样,这是非标准的......
【解决方案2】:

我在这里推测,但是:C 最初是由专业的、练习的程序员设计和实现的,目的是用它编写真正的程序。而且,虽然实际程序发现始终以十进制和十六进制打印是必要且有用的,但以二进制打印通常并不重要。这需要很多空间,如果你是一名专业程序员并且你有一个数字,你正在考虑以二进制形式,例如某种位掩码,传统的做法是以更紧凑的十六进制表示形式打印它,然后在需要时在头脑中转换为二进制。

当然,以二进制打印东西对于学生程序员来说是非常有趣的,如果没有其他原因,他们的教师总是将其作为练习分配。当然,C 语言的设计从来没有考虑过初级程序员。

如果(正如我上面所建议的)十进制和十六进制是最常见和最有用的,你可能会问,那么为什么 printf 支持 %o?有人说,那里的答案很简单,八进制是在 PDP-11 上用机器语言表示机器常量和其他二进制数的传统方式,这当然是 C 的原始平台。

另请参阅C FAQ list 中的question 20.11

【讨论】:

  • 另外,你不需要成为 C 向导天才级别的程序员来完成这项任务? 他们可能已经考虑到了这一点;为什么要让标准库负担相对未使用且易于编写的东西?
  • 按照这个逻辑,我们也不需要成为使用其他基数打印数字的向导,那么他们为什么要让标准库负担这些呢?提供便利很重要,这样不是每个人都需要一直成为向导,让他们花时间开发更高层次的东西。
  • 确实如此。 如果 以二进制打印很有用,那么在printf 本身中添加对它的支持基本上是微不足道的。 (你甚至不能声称它会使代码膨胀;在 PDP-11 天,当 64K 对真正的程序员来说已经足够时,你甚至可能无法声称它。)另一方面,在之后单独将其入侵到 printf事实并非微不足道(大多数程序员手头没有标准库源代码,如果有的话也不知道如何构建它),并且使用printf 表示十进制、八进制和十六进制,同时不得不使用一些二进制的偏旁机制是一种明显的麻烦。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2015-12-12
  • 2014-03-11
  • 1970-01-01
  • 1970-01-01
  • 2012-12-12
  • 1970-01-01
相关资源
最近更新 更多