#include<stdio.h>
#include<stdlib.h>
int main(void)
{
int x, *ptr_x;
float f , *ptr_f;
ptr_f = &f;
ptr_x = &x;
*ptr_x = 5;
*ptr_f = 1.5; //printf("%d %f\n", f,x);
printf ("\n\nxd = %d \t xf = %f \n ff = %f \t fd = %d", x,x,f,f);
return 0;
}
ff = %f 的输出不是预期的。
xd = 5 xf = 0.000000
ff = 0.000000fd = 1073217536
printf() 不是类型安全的。
您传递给的参数printf()
是根据什么来对待的you向编译器承诺。
Also, float
s 晋升为double
s 当通过可变参数传递时。
所以当你向编译器承诺%f
第一次(对于xf
),编译器吞噬了整个double
(通常是 8 个字节)来自参数,在这个过程中吞掉你的浮点数。然后是第二个%f
直接切入第二个双精度数的零尾数。
这是你的论点的图片:
+-0-1-2-3-+-0-1-2-3-+-0-1-2-3-4-5-6-7-+-0-1-2-3-4-5-6-7-+
| x | x | f | f |
+---------+---------+-----------------+-----------------+
%d--------|%f----------------|%f---------------|%d------|
But f
看起来像这样(已晋升为double
):
f = 3FF8000000000000
让我们用值再次绘制它,并推测您的机器字节序:
| 05000000 | 05000000 | 00000000 0000F83F | 00000000 0000F83F |
| %d, OK | %f, denormal... | %f, denormal... | %d, OK |
请注意,1073217536 是 0x3FF80000。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)