1、printf函数原理
如果遇到普通字符,直接输出。
如果遇到格式说明符(如 %d、%f 等),则根据说明符的类型从参数列表(va_list)
中取出对应的值,并按照指定的格式进行转换,这一句话其实描述的是va_arg(ap, t)这个函数的功能。 然后再输出转换后的字符串。
而ap就是参数列表,它的结构体在arch64架构是这样定义的
typedef struct __va_list {
void *__stack; // 指向堆栈上的参数区域
void *__gr_top; // 通用寄存器区域的顶部指针
void *__vr_top; // 浮点寄存器区域的顶部指针
int __gr_offs; // 通用寄存器的偏移量
int __vr_offs; // 浮点寄存器的偏移量
} va_list;
整数参数可能存储在通用寄存器中,浮点参数存储在浮点数寄存器中,多余的参数存储在堆栈上。
2、格式字符串
格式字符串可以包含普通字符和格式说明符(以 % 开头)。
常见格式说明符
- %d 或 %i:十进制整数。
- %u:无符号十进制整数。
- %f:浮点数(默认显示 6 位小数)。
- %lf:双精度浮点数
(与 %f 等效)。
- %c:单个字符。
- %s:字符串。
- %x 或 %X:十六进制整数(小写或大写)。
- %o:八进制整数。
- %%:输出一个 % 符号。
格式修饰符
格式说明符还可以带有修饰符,用于控制输出的宽度、精度等:
- 宽度修饰符:%5d(表示输出宽度为 5 个字符,不足部分用空格填充)。
- 精度修饰符:%.2f(表示浮点数保留 2 位小数)。
- 对齐方式:%-5d(左对齐)。
- 填充字符:%05d(用 0 填充)。
3、参考
https://mp.weixin.qq.com/s/LRK9Byd7UqVqctB9rY1rjw
https://mp.weixin.qq.com/s/_4MvlMQOcSEBzI-5SN-CTg