繁体   English   中英

printf 中两个数字的除法返回 c 中的垃圾值

[英]Division of two numbers in printf return garbage value in c

printf("%d", (float) 9/ (float) 5); output 是什么?

注意:在printf function 格式说明符是%d

似乎 output 将是0 ,就像下面的代码返回答案 0 一样。

float a = 9/5;
printf("%d",a);

但一点也不。 正确的 output 是-1073741824作为垃圾值这就是问题所在。 为什么?

我们可以进行显式类型转换,将 integer 数据类型转换为浮点数据类型。

但是为什么类型转换在这个printf("%d", (float) 9/ (float) 5); 代码?

我知道这是一个愚蠢的问题,但我想知道这个愚蠢的问题。

printf()除了你给它的 "%d" 格式说明符之外,无法知道你传递的是什么类型。 当它看到“%d”时,它将使用va_arg()从它收到的 arguments 中提取一个 integer。 那里没有 integer,所以任何事情都可能发生。 浮点值通常在与整数不同的寄存器中传递,所以这不像你只是将 float 解释为 int,你实际上是从某个未知的地方加载一个 int。

(float)9 / (float)5 (或更简单9.0f / 5.0f )的值为1.8f 9/5的值为1 ,并且当分配给 float 时隐式转换为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) ) ;

两者都显示分别解释为intab的位模式。 结果是确定性的,反映了传递的值1.8f1.0f 十六进制的 output 值:

a = 3FE66666
b = 3F800000

分别对应https中的1.8和1.0://www.h-schmidt.net/FloatConverter/IEEE754.html

尝试使用“未定义行为”代码的变体,没有一致性 - 结果是不确定的,并且与传递的值没有意义或对应关系。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM