C语言中,printf()函数针对输出不同的数据类型,有不同的格式控制符,此处汇总了一些常用的格式控制符:
%hd
用来输出 short int 类型,hd 是 short decimal 的简写;%d
用来输出 int 类型,d 是 decimal 的简写;%ld
用来输出 long int 类型,ld 是 long decimal 的简写。
- %c:输出一个字符。c 是 character 的简写。
- %s:输出一个字符串。s 是 string 的简写。
- %f:输出一个小数。f 是 float 的简写。
在输出整数方面,格式控制符和整数的符号是紧密相关的,具体就是:
- %d 以十进制形式输出有符号数;
- %u 以十进制形式输出无符号数;
- %o 以八进制形式输出无符号数;
- %x 以十六进制形式输出无符号数。
printf函数并不支持“输出负的八进制或者十六进制数”。
下表总结了不同类型的整数,以不同进制的形式输出时对应的格式控制符(--表示没有对应的格式控制符)
short | int | long | unsigned short | unsigned int | unsigned long | |
---|---|---|---|---|---|---|
八进制 | -- | -- | -- | %ho | %o | %lo |
十进制 | %hd | %d | %ld | %hu | %u | %lu |
十六进制 | -- | -- | -- | %hx 或者 %hX | %x 或者 %X | %lx 或者 %lX |
对于一个有符号的正数,它的符号位是0,当按照无符号数的形式读取时,符号位就变成了数值位,但是该位恰好是0而不是1,因此,用%o或者%x输出,不会有影响;
如果一个有符号整数是负数,这时候用%o或者%x输出,则结果就会大相径庭。
可以说,“有符号正数的最高位是0”这个巧合才使得%o和%x输出有符号数时不会出错
小数的输出格式:
- %f 以十进制形式输出float类型;
- %lf 以十进制形式输出double类型;
- %e 以指数形式输出float类型,输出结果中的 e 小写;
- %E 以指数形式输出float类型,输出结果中的 E 大写;
- %le 以指数形式输出double类型,输出结果中的 e 小写;
- %lE 以指数形式输出double类型,输出结果中的 E 大写。
下面有一段演示代码
#include <stdio.h> #include <stdlib.h> int main() { float a = 0.302; float b = 128.101; double c = 123; float d = 112.64E3; double e = 0.7623e-2; float f = 1.23002398; printf("a=%e \nb=%f \nc=%lf \nd=%lE \ne=%lf \nf=%f\n", a, b, c, d, e, f); return 0; }
输出结果为:
a=3.020000e-01
b=128.100998
c=123.000000
d=1.126400E+05
e=0.007623
f=1.230024
对代码的说明:
- %f 和 %lf 默认保留六位小数,不足六位以 0 补齐,超过六位按四舍五入截断
- 将整数赋值给 float 变量时会变成小数
- 以指数形式输出小数时,输出结果为科学计数法;也就是说,尾数部分的取值为:0 ≤ 尾数 < 10。
- b的输出有点让人不理解,明明初始化的时候,只有三位小数,为什么不能精确输出呢?这和小数在内存中的存储形式有关,很多简单的小数压根不能精确存储,所以也就不能精确输出
另外,小数还有一种更加只能的输出方式,就是使用%g。 %g会对比小数的十进制形式和指数形式,以最短的方式输出小数,让输出结果更加简练。所谓最短,就是输出结果占用最少的字符。
读者需要注意的两点是:
- %g 默认最多保留六位有效数字,包括整数部分和小数部分;%f 和 %e 默认保留六位小数,只包括小数部分。
- %g 不会在最后强加 0 来凑够有效数字的位数,而 %f 和 %e 会在最后强加 0 来凑够小数部分的位数。
除了 %g,还有 %lg、%G、%lG:
- %g 和 %lg 分别用来输出 float 类型和 double 类型,并且当以指数形式输出时,
e
小写。 - %G 和 %lG 也分别用来输出 float 类型和 double 类型,只是当以指数形式输出时,
E
大写。