printf能不能输出二进制,毫无疑问,不能。

C语言中,可以用printf输出八进制、十进制、十六进制,但就是二进制没有得到支持。 至于原因,有很多种说法,有说二进制太长,输出太占地方,也有说当初在实验室发明C语言的时候,用不到二进制,有八进制十进制十六进制就够。至于哪种说法靠谱,也不太好验证。

但是事实却是,我们在学习编程的时候,很多时候需要用到二进制来分析一些问题。

虽然printf本身不支持,但是也有一些非标准内的函数实现了相应的功能,比如itoa

char *itoa (int value, char *str, int base );

提供了三个参数,分别是:

  • 要转换的整数;
  • 转换后存放结果的地址;
  • 转换的进制数,可以是2 8 10 16等等。

如果你的编译器支持,可以借助这个函数来实现。

不过这个函数也只是Windows下的一些编译器支持,移植到Linux上就不行。

如果要实现这个功能,只能自己动手。

实现二进制输出不难。

假设数字只有 8 位,从最高位到最低位输出。

(num >> 7) & 1
  1. 先右移七位,跟1进行与运算,得到最高位。
  2. 重复操作,就能得到数字对应的二进制。
  3. 不管是正数、负数或者是 32 位数字,用这个方法都行。
  4. 如果是小数的话,得换个算法重新计算。

最后再补充一下,在刚刚发布的 C23 标准中,已经加入了对二进制的支持,printf可以直接使用 %b 输出二进制。

如果你的编译器已经更新到了比较新的版本,可以通过代码来验证一下。