AARiors 发表于 2020-4-13 00:45:24

求助呀

#include <stdio.h>

int main()
{
    double a=4.5;
    printf("%d",a);
    return 0;
}

这样写为什么系统不报错,而运行显示0呀?

sunrise085 发表于 2020-4-13 00:53:25

因为你是用%d输出的。double是八个字节,你使用%d输出只能输出前四个字节。
double的4.5在内存中存储的前四个字节就是0,
你可以用此程序看一下
#include <stdio.h>
union Num{
    double lf;
    int d;
    char ch;
};
int main()
{
    int i;
    union Num num;
    num.lf=4.5;
    printf("double类型的4.5存储,占8个字节\n");
    printf("f=%f\n两个四字节以16进制显示:",num.lf);
    for(i=0;i<2;i++)
      printf("d[%d]=%x\t",i,num.d);
    printf("\n两个四字节以10进制显示:");
    for(i=0;i<2;i++)
      printf("d[%d]=%d   ",i,num.d);
    printf("\n八个单字节:");
    for(i=0;i<8;i++)
      printf("ch[%d]=%d   ",i,num.ch);
    return 0;
}
有兴趣的话,还可以看看我写的这个帖子
C语言中浮点数存储与%f输出细节探究

jackz007 发表于 2020-4-13 00:54:41

      printf() 中的格式描述符 %d 是用来输出整型数的,不能用来输出双精度数
    printf("%d",a);
      a 是双精度变量,所以,printf() 中的格式描述符应该使用 %lf
    printf("%lf",a);

Aiopr 发表于 2020-4-13 02:42:02

输出double型的变量要用lf%哦

墨羽岚 发表于 2020-4-13 08:59:31

Aiopr 发表于 2020-4-13 02:42
输出double型的变量要用lf%哦

{:10_334:}你写反了

4goodworld 发表于 2020-4-13 13:05:55

本帖最后由 4goodworld 于 2020-4-13 13:07 编辑

你以为写清楚了数据类型,double a=4.5,但a这个变量的值在内存里面的体现就是一组4字节或者说是32位的0和1的组合而已,
理论上 double应该用%lf格式来 printf
而你非要用%d来打印,
就好像
he,你英文翻译的是“他”,而拼音的意思就是“和”,我们一般理解,he是英文的居多点,
但你非要说我这个是拼音模式,那么打印出来的意思就只能是发音为he的中文意思
同理,编译器看你 %d 那么就把a变量这串组合按照int型的表达表示表达出来,结果就是你看到的那样
页: [1]
查看完整版本: 求助呀