#include <stdio.h>
int main() {
printf("%f\n", 5);
printf("%f\n", 5.0);
printf("%d\n", 5.01);
return 0;
}
输出结果:
0.000000
5.000000
1889785610
[Finished in 0.3s]
请问输出结果为什么这么奇怪(第二个输出除外)?
#include <stdio.h>
int main() {
printf("%f\n", 5);
printf("%f\n", 5.0);
printf("%d\n", 5.01);
return 0;
}
输出结果:
0.000000
5.000000
1889785610
[Finished in 0.3s]
请问输出结果为什么这么奇怪(第二个输出除外)?
整型数字5在内存中是 00000000 00000000 00000000 00000101
%f
代表将这个数字当做浮点型对待,相当于做一次强制转化
浮点型怎么表示?请百度IEEE754 浮点格式,简单来说就是 ± 有效数字 * 2 的 指数 次方
第一位 表示正负符号 0 代表 +
第2-9位 表示指数 exp 00000000 代表-126次方
最后23位 表示 有效数字的小数部分 即 0.00000000000000000000101 (二进制) ≈ 0.000000596 (十进制)
转化成十进制 就是 + 0.000000596 * 2 ^ -126 ≈ 7e-45
显示成浮点就是0.
后面44个0
, 当然是0.000000
了!
第三个 自己体会吧!
1 回答3.3k 阅读
1 回答1.1k 阅读✓ 已解决
1.1k 阅读
c语言中printf不会对类型进行转换,它只是按照对应格式(如%d,%f等)从内存中读取值.
内存中的存储方法是二进制.
第一种
int类型一般为16bit或者32bit,从第三种的结果看是32bit,5就是0000,0000,0000,0000,0000,0000,0000,0101
如果按照float(64bit)来读取的话前面会多读取很多未写入的位(都是0),最后按照(有效数字)*(基数2)pow(指数)的方式取数,结果就是0.
第二种是正常读取
第三种就是按照%d(32bit)来读取5.01的二进制数字,所以会出现这样的数字