printf函数参数类型和打印格式不匹配

转载笔记1

1.赋值时的自动转换

int a = 1.5;
printf("%d", a);

输出值为1 因为1.5是一个double类型,但是在赋值为a时,由于a是一个int类型,所以将小数部分舍去,a为1

2.printf函数中不涉及自动转换

他只按照固定的格式打印,如果解析失败,就输出对应格式下的0

int a = 1;
printf("%f",a);

输出0.000000  因为a是int类型,用float类型就会解析失败,所以输出浮点数格式的0,即为0.000000

其余的类似,如%c下解析失败输出一个空格

转载笔记2

int a=4;
printf("%f  %e\n",a,a);
float b=4;
printf("%f  %e\n",b,b);
int n1=-1,n2=-2,n3=-3;
printf("%lld %lld %lld\n",n1,n2,n3);

在这里插入图片描述
输出结果并非像预期的那样会自行转换数据类型!

原因在于printf后边的变量以栈的方式存储,而%f、%lld等转换说明符的操作方式是从栈中读取该符号对应数据类型的字节数,并不关心后边对应的数据类型具体是什么!

比如%f,要读取8字节,而a存到堆栈中只有4字节,当然会出现错误!

为了保证正确的输出,可以在输出前转换数据类型,这样不会有问题!
在这里插入图片描述
转载笔记3
printf输出格式总结

格式字符意义
d以十进制形式输出带符号整数(正数不输出符号)
o以八进制形式输出无符号整数(不输出前缀0)
x,X以十六进制形式输出无符号整数(不输出前缀Ox)
u以十进制形式输出无符号整数
f以小数形式输出单、双精度实数
e,E以指数形式输出单、双精度实数
g,G以%f或%e中较短的输出宽度输出单、双精度实数
c输出单个字符
s输出字符串
#include<stdio.h>
#include<string.h>
int main()
{
char c, s[20];
int a=1234;
float f=3.141592653589;
double x=0.12345678912345678;
strcpy(s, “Hello,World”);
c=’\x41′;
printf(“a=%d\n”, a);//按照十进制整数格式输出,显示 a=1234
printf(“a=%d%%\n”, a);//输出%号 结果 a=1234%
printf(“a=%6d\n”, a);//输出6位十进制整数 左边补空格,显示 a= 1234
printf(“a=%06d\n”, a);//输出6位十进制整数 左边补0,显示 a=001234
printf(“a=%2d\n”, a);//a超过2位,按实际输出 a=1234
printf(“a=%-6d\n”, a);///输出6位十进制整数 右边补空格,显示 a=1234
printf(“f=%f\n”, f);//浮点数有效数字是7位,结果 f=3.141593
printf(“f=6.4f\n”, f);//输出6列,小数点后4位,结果 f=3.1416
printf(“x=%lf\n”, x);//输出长浮点数 x=0.123457
printf(“x=%18.16lf\n”, x);//输出18列,小数点后16位,x=0.1234567891234567
printf(“c=%c\n”, c);     //输出字符 c=A
printf(“c=%x\n”, c);//以十六进制输出字符的ASCII码 c=41
printf(“s[]=%s\n”, s);//输出数组字符串s[]=Hello,World
printf(“s[]=%6.9s\n”, s);//输出最多9个字符的字符串 s[]=Hello,Wor
return 0;
}

转载笔记4
如何输出类型为uint_16,uint_32,uint_64等类型的变量

uint64_t a=1;
printf("uint64_t a=%f",a);
warning: format ‘%f’ expects argument of type ‘double
#define PRIu8 "u"
#define PRIu16 "u"
#define PRIu32 "u"
#define PRIu64 "I64u"
>#define PRId8 "d"
#define PRId16 "d"
#define PRId32 "d"
#define PRId64 "I64d"
printf("uint64_t a=%" PRIu64,num);

printf()终极详解

  • 9
    点赞
  • 27
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值