printf中两个数字的除法return c中的垃圾值
Division of two numbers in printf return garbage value in c
在printf("%d", (float) 9/ (float) 5);
中输出什么?
Note: In printf
function the format specifier is %d
输出似乎是 0 就像下面的代码 return answer 0.
float a = 9/5;
printf("%d",a);
但一点也不。正确的输出是 -1073741824
作为 垃圾值 这就是问题所在。为什么?
我们可以进行显式类型转换,将整数数据类型转换为浮点数据类型。
但为什么类型转换在此 printf("%d", (float) 9/ (float) 5);
代码中不起作用?
我知道这是一个愚蠢的问题,但我想知道这个愚蠢的问题。
printf()
除了您提供的“%d”格式说明符外,无法知道您传递的是什么类型。当它看到 "%d" 时,它将使用 va_arg()
从它收到的参数中提取一个整数。那里没有整数,所以任何事情都有可能发生。浮点值通常在与整数不同的寄存器中传递,所以这不像你只是将浮点数解释为 int,你实际上是从某个未知的地方加载一个 int。
(float)9 / (float)5
(或更简单地说 9.0f / 5.0f
)的值为 1.8f
。而 9/5
的值是 1
,并且当分配给浮点数时隐式转换为 1.0f
(相当于 (float)(9/5)
)。
在这两种情况下,使用 %d
格式说明符解释任一值都具有未定义的行为,但结果不同并不奇怪,因为输入不同。也就是说,即使值是相同的,这也不应该令人惊讶 - 这是未定义行为的事情 - 所有赌注都关闭了。
考虑:
float a = 9.0f / 5.0f ;
printf( "%d\n", *(int*)(&a) ) ;
float b = 9 / 5 ;
printf( "%d\n", *(int*)(&b) ) ;
两者都显示 a
和 b
的位模式,分别解释为 int
。结果是确定性的,反映了传递的值 1.8f
和 1.0f
。 hexadecimal:
中的输出值
a = 3FE66666
b = 3F800000
分别对应https://www.h-schmidt.net/FloatConverter/IEEE754.html
处的1.8和1.0
Experimenting with variations 你的“未定义行为”代码,没有一致性 - 结果是 non-deterministic 并且与传递的值没有意义或对应。
在printf("%d", (float) 9/ (float) 5);
中输出什么?
Note: In
printf
function the format specifier is%d
输出似乎是 0 就像下面的代码 return answer 0.
float a = 9/5;
printf("%d",a);
但一点也不。正确的输出是 -1073741824
作为 垃圾值 这就是问题所在。为什么?
我们可以进行显式类型转换,将整数数据类型转换为浮点数据类型。
但为什么类型转换在此 printf("%d", (float) 9/ (float) 5);
代码中不起作用?
我知道这是一个愚蠢的问题,但我想知道这个愚蠢的问题。
printf()
除了您提供的“%d”格式说明符外,无法知道您传递的是什么类型。当它看到 "%d" 时,它将使用 va_arg()
从它收到的参数中提取一个整数。那里没有整数,所以任何事情都有可能发生。浮点值通常在与整数不同的寄存器中传递,所以这不像你只是将浮点数解释为 int,你实际上是从某个未知的地方加载一个 int。
(float)9 / (float)5
(或更简单地说 9.0f / 5.0f
)的值为 1.8f
。而 9/5
的值是 1
,并且当分配给浮点数时隐式转换为 1.0f
(相当于 (float)(9/5)
)。
在这两种情况下,使用 %d
格式说明符解释任一值都具有未定义的行为,但结果不同并不奇怪,因为输入不同。也就是说,即使值是相同的,这也不应该令人惊讶 - 这是未定义行为的事情 - 所有赌注都关闭了。
考虑:
float a = 9.0f / 5.0f ;
printf( "%d\n", *(int*)(&a) ) ;
float b = 9 / 5 ;
printf( "%d\n", *(int*)(&b) ) ;
两者都显示 a
和 b
的位模式,分别解释为 int
。结果是确定性的,反映了传递的值 1.8f
和 1.0f
。 hexadecimal:
a = 3FE66666
b = 3F800000
分别对应https://www.h-schmidt.net/FloatConverter/IEEE754.html
处的1.8和1.0Experimenting with variations 你的“未定义行为”代码,没有一致性 - 结果是 non-deterministic 并且与传递的值没有意义或对应。