我正在尝试这样一个相当简单的代码:
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有什么关系?
答案 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
因此,当printf
将1.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将有特殊的方式来读取它,但不是通过十进制方式。所以,你会得到奇怪的结果。
为什么会出现这种奇怪的结果?
我只是简单解释一下:在计算机中,实数由两部分组成:exponent
和mantissa
。如果你说:这是一个实数,C将知道哪个是指数,哪个是尾数。但是,因为你说:嘿,这是整数。指数部分和尾数部分之间没有区别 - &gt;奇怪的结果。
如果你想要准确理解,怎么知道它会打印哪个整数(当然,你可以猜到)。您可以访问此链接:represent FLOAT number in memory in C
如果您不想获得此trange结果,可以将int
转换为float,因此,它将打印浮点数的整数部分。
float a = 1.5;
printf("%d",(int)a);
希望这有帮助:)