printf 函数输出

#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]
请问输出结果为什么这么奇怪(第二个输出除外)?

阅读 4.7k
4 个回答

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的二进制数字,所以会出现这样的数字

5不是f。5.01也不是d。
f和d,也就是浮点数和整数在计算机内存中存储的格式是不一样的。
以下是浮点数的存储。
浮点数存储

整型数字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 了!

第三个 自己体会吧!

谢谢大家的解答

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进