打印浮点数为整数时的结果不一致

时间:2012-11-01 17:05:18

标签: c floating-point integer double endianness

  

可能重复:
  print the float value in integer in C language

我正在尝试这样一个相当简单的代码:

float a = 1.5;
printf("%d",a);

打印出0。但是,对于其他值,如1.4,1.21等,它会打印出一个垃圾值。不仅是1.5,1.25,1.5,1.75,1.3125(换句话说,十进制数可以完美地转换成二进制形式),它是打印0。这背后的原因是什么?我发现了一篇类似的帖子here,第一个答案看起来很棒,但我无法辨别。任何机构都能解释为什么会这样吗? endian-ness与t有什么关系?

4 个答案:

答案 0 :(得分:2)

你没有投射浮动,printf只是将它解释为一个整数,这就是你得到看似垃圾值的原因。

修改

查看此示例C代码,其中显示了double如何存储在内存中:

int main()
{
    double a = 1.5;
    unsigned char *p = &a;
    int i;

    for (i=0; i<sizeof(double); i++) {
        printf("%.2x", *(p+i));
    }
    printf("\n");
    return 0;
}

如果您使用1.5运行它,则会打印

000000000000f83f

如果您尝试使用1.41打印

b81e85eb51b8f63f

因此,当printf1.5解释为int时,它会打印为零,因为4个LSB在使用1.41时为零且有其他值。

话虽如此,它是一个 未定义的行为 ,你应该避免它加上你不会总是得到相同的结果,它取决于机器和参数如何通过。

注意:字节相反,因为它是在小印度机上编译的,这意味着最低有效字节首先出现。

答案 1 :(得分:1)

你不关心参数促销。因为printf是一个可变函数,所以参数被提升:

  

C11(n1570),§6.5.2.2函数调用
  具有float类型的参数被提升为double。

因此printf会尝试将您的double变量解释为整数类型。它导致一种未定义的行为。只需添加一个演员:

double a = 1.5;
printf("%d", (int)a);

答案 2 :(得分:1)

printf中参数不匹配的是undefined beahivour 要么使用类型a,要么使用%f

使用这种方式

printf("%d",(int)a);

printf("%f",a);

答案 3 :(得分:0)

代表:decimal。所以,无论如何是浮点数/双/整数/字符,....当你使用:&#34;%d&#34;时,C将按十进制打印该数字。所以,如果a是整数类型(整数,长整数),没问题。如果a是char:因为char是一个整数类型,所以,C将以ASCII格式打印char值。

但是,问题出现了,当a是float类型(float / double)时,只是因为如果a是float类型,C将有特殊的方式来读取它,但不是通过十进制方式。所以,你会得到奇怪的结果。

为什么会出现这种奇怪的结果?

我只是简单解释一下:在计算机中,实数由两部分组成:exponentmantissa。如果你说:这是一个实数,C将知道哪个是指数,哪个是尾数。但是,因为你说:嘿,这是整数。指数部分和尾数部分之间没有区别 - &gt;奇怪的结果。

如果你想要准确理解,怎么知道它会打印哪个整数(当然,你可以猜到)。您可以访问此链接:represent FLOAT number in memory in C

如果您不想获得此trange结果,可以将int转换为float,因此,它将打印浮点数的整数部分。

 float a = 1.5;
   printf("%d",(int)a);

希望这有帮助:)