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进行与运算,得到最高位。
- 重复操作,就能得到数字对应的二进制。
- 不管是正数、负数或者是 32 位数字,用这个方法都行。
- 如果是小数的话,得换个算法重新计算。
最后再补充一下,在刚刚发布的 C23 标准中,已经加入了对二进制的支持,printf
可以直接使用 %b
输出二进制。
如果你的编译器已经更新到了比较新的版本,可以通过代码来验证一下。