这个程序是如何运作的?
#include <stdio.h>
int main() {
float a = 1234.5f;
printf("%d
", a);
return 0;
}
它显示一个 0
!!这怎么可能?这是什么道理?
It displays a 0
!! How is that possible? What is the reasoning?
我特意在printf
语句中放了一个%d
来研究printf
的行为.
I have deliberately put a %d
in the printf
statement to study the behaviour of printf
.
推荐答案
那是因为 %d
需要一个 int
但你提供了一个浮点数.
That's because %d
expects an int
but you've provided a float.
使用 %e
/%f
/%g
打印浮点数.
Use %e
/%f
/%g
to print the float.
关于为什么打印0:浮点数在发送到printf
之前被转换为double
.1234.5 小端双数表示法是
On why 0 is printed: The floating point number is converted to double
before sending to printf
. The number 1234.5 in double representation in little endian is
00 00 00 00 00 4A 93 40
A %d
使用 32 位整数,因此打印零.(作为测试,您可以 printf("%d, %d
", 1234.5f);
您可以获得输出 0, 1083394560
.)
A %d
consumes a 32-bit integer, so a zero is printed. (As a test, you could printf("%d, %d
", 1234.5f);
You could get on output 0, 1083394560
.)
至于为什么将float
转成double
,因为printf的原型是int printf(const char*, ...)
,来自 6.5.2.2/7,
As for why the float
is converted to double
, as the prototype of printf is int printf(const char*, ...)
, from 6.5.2.2/7,
函数原型声明符中的省略号会导致参数类型转换在最后一个声明的参数之后停止.对尾随参数执行默认参数提升.
The ellipsis notation in a function prototype declarator causes argument type conversion to stop after the last declared parameter. The default argument promotions are performed on trailing arguments.
从 6.5.2.2/6 开始,
and from 6.5.2.2/6,
如果表示被调用函数的表达式的类型不包含原型,则对每个参数执行整数提升,将float
类型的参数提升为double
.这些被称为默认参数提升.
If the expression that denotes the called function has a type that does not include a prototype, the integer promotions are performed on each argument, and arguments that have type
float
are promoted todouble
. These are called the default argument promotions.
(感谢 Alok 发现这一点.)
(Thanks Alok for finding this out.)
相关文章