C语言printf打印的奥秘

Posted 我想月薪过万

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C语言printf打印的奥秘相关的知识,希望对你有一定的参考价值。

基础补充

想完全掌握C语言的 printf() 函数,你就得明白C语言中的基本类型及其所占字节数。

 位、字节、字的概念大家自己百度了解。下面我只给其关系:

8位 = 1字节     

2字节 = 1字

代码示例

作为一个刚入门的小白,我们玩的数据都是十分小的,一般不会超过 4个字节(4294967296),所以,我们用什么格式化打印都不会出错。

案例一:小数据,大打印

我们现在选择一个不超过 4个字节 的数据,例如:9999。

十进制表示:9999

十六进制表示:0X270F

二进制表示:10 0111 0000 1111

因为 9999 不超过4个字节,所以,你可以用 int 装,或 long 装,甚至可以用 short 装。

 C语言中常用的整数有 short、int 和 long 三种类型,通过 printf 函数,可以将它们以八进制、十进制和十六进制的形式输出。上节我们讲解了如何以十进制的形式输出,这节我们重点讲解如何以八进制和十六进制的形式输出,下表列出了不同类型的整数、以不同进制的形式输出时对应的格式控制符:二进制数、八进制数和十六进制数的输出

以 int 存数据,以 int输出数据

可以看到是完美的输出。可想而知,我们以 long 的方式(%lx)也是照样能丝毫误差的打印。

案例二:大数据,小打印

十进制数据:9999999999

十六进制数据:2 540B E3FF

二进制数据:10 0101 0100 0000 1011 1110 0011 1111 1111

大家很明显的能看到,这个数据是 5个字节,你用 int 存储就会报错。所以,我们得用 long long 来存取。因为 long 根据不同操作系统会变化,4或8不固定。

以 long long存取数据,以 int 打印数据:

编译的时候会报警告,大家不必理会,因为我们现在要验证一个伟大的知识。

编译通过之后,大家运行一下,看看它到底打印什么东西。

可以看到,打印的是 540be3ff,我们把它和我们的原始数据对比一下:

原数据:    2 540B E3FF

输出数据:   540b  e3ff

通过对比,我们可以很明显的感受到,数据被截断了,而且还是按照 int 字节大小截断的。现在明白了 大数据 小打印 的错误了吧。我们来看看正确的打印结果:

总结 

所以,大家在进行C语言数据 printf 的时候,发现数据不对劲了,你就得想想是不是打印数据类型选择有问题。

以上是关于C语言printf打印的奥秘的主要内容,如果未能解决你的问题,请参考以下文章

c语言打印double类型

C语言模块打印打印printf,行号和函数名

C语言模块打印打印printf,行号和函数名

C语言进阶之旅 (每日一题)打印菱形

C语言——格式化打印printf(常用整理)

cmd输出中文 C语言终端输出中文 c语言printf输出中文 cmd打印中文