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下解析失败输出一个空格
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);