(2 * 3.14f)的类型是什么?

时间:2014-04-05 12:48:49

标签: c types sizeof

我刚刚写了一些东西来测试sizeof运算符。

首先,当我构建这个程序时,GCC会给我一个警告。

main(){
    printf("%d", (2*3.14f));
}
// test.c|2|warning: format '%d' expects argument of type 'int',
// but argument 2 has type 'double' [-Wformat=]

因此,GCC认为(2*3.14f)的类型为double

然后我添加了一个sizeof运算符,我假设输出正好是8,这是double的大小。

main(){
    printf("%d", sizeof(2*3.14f));
}
//Output: 4

这真令人困惑。所以问题是:(2*3.14f)的类型是什么?

2 个答案:

答案 0 :(得分:4)

(2*3.14f)的类型为float。传递给可变参数函数时,它被提升为double,因此在GCC的错误消息中引用double

如果您希望将float转换为int,请使用printf("%d", (int)…);

如果您希望将float的位显示为int,请使用:

int i;
assert(sizeof(f) == sizeof(i));
memcpy(&i, &f, sizeof(f));
printf("%d", i);

答案 1 :(得分:1)

两个调用都有未定义的行为。实际上,第一个参数的类型为double,第二个size_t,因此您必须分别使用格式说明符%f%zu

2 * 3.14f的类型为float,因为通常会进行算术转换,但在浮点转换下,参数会提升为double,因为您传递了它作为变量参数。)