我刚刚写了一些东西来测试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)
的类型是什么?
答案 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
,因为您传递了它作为变量参数。)