为什么pow()函数使用%d输出一直为0?为什么整数使用%f输出也一直为0?

为什么pow()函数使用%d输出一直为0?为什么整数使用%f输出也一直为0?两者有何联系?
通过下面这个简单代码即可直观发现他们的输出

#include<stdio.h>
#include<math.h>
int main()
{ 
    printf("%d   ",pow(2,0));
    printf("%f   ",1);
    printf("%f   ",32974921380434);
    printf("%d   ",2.233333);
    printf("%f",2.233333);
    return 0;
}

运行结果:
在这里插入图片描述

  • 首先pow()函数返回类型为float/double,在TC2.0中原型为extern float pow(float x, float y) ,而在VC6.0中原型为double pow( double x, double y),故返回结果为实型。pow(2,0)为1,整型1内部表示如果看作是float,是个很小的数所以返回的是0.000000,但是又由于是%d输出,所以小数点后的0去掉,就成了我们错误的结果。将整型按%f输出就是0.000000。
  • 浮点型按照%d输出可能为0可能为一串不匹配的数字为0是因为a的数据放在地址的高端,而整型比浮点数内存中占的字节数少,整型只会把属于它的字节数读出来,如在Win32,VC6.0下,Int是4位,它就会把从a开始的4位读出来(按整型格式),所以它把浮点数低端地址的0给输出出来。为一串不匹配的数字是因为计算机是以补码的方式存储数据的,在读取了int型规定字节数后就将读取的值转换输出。而浮点型在计算机中的存储方式为符号位+指数位+尾数部分,读取的int型规定字节数的内容并不代表了浮点型的数据,故使用%d读取浮点型会产生一串不匹配的数字。
发布了21 篇原创文章 · 获赞 2 · 访问量 3367

猜你喜欢

转载自blog.csdn.net/weixin_44164333/article/details/104764295
今日推荐