2017-07-17 102 views
0

我有一个函数返回unsigned long实际上是float为什么投这个指针也改变了指向的值

我们将调用该函数unsigned long foo()

当我打电话给printf像这样:

printf("%f", foo()); 

它总是会打印出0.00000

但是当我投它是这样的:

unsigned long bar = foo(); 
printf("%f", *((float *)(&bar))); 

它正确输出浮点数。

"%x"打印我可以看到二进制表示是不同的。令人惊讶的是unsigned long版本看起来更像是一个实际的浮点表示(41ba019a VS 40000000

我双击我的系统,它的unsigned longfloat大小是相同的检查。

所以我的问题是:

如何铸造这样的指针更改被指向什么价值?

编辑:foo的相关部分()本质上是

unsigned long foo() 
{ 
    float a = 22.4; 
    return *(unsigned long *)(&a) ; 
} 
+0

你没有向我们展示最重要的东西。让我们看看'foo()'。 –

+0

无符号长整型的值是从浮点开始的。该函数可以根据参数返回不同的类型。 – rtpax

+0

那么?我们来看看相关的部分。 –

回答

2

这是因为浮子,当传递给函数,首先提升为双重,所以printf的预计要打印的双。由于foo不返回浮点数,因此转换不会执行,因此printf会查找其他参数。

+0

将'float'升级为'double'对于可变参数函数(例如'printf()')是特定的,而不是所有函数。 – Clifford

+0

@Clifford,你有参考(只是为了我的好奇)?我不知道。 –

+0

http://en.cppreference.com/w/cpp/language/variadic_arguments – Clifford