如何从整数引用浮点指针时告诉浮点指针的值?例如:float * f =(float *)someInteger

时间:2016-08-19 03:13:48

标签: c pointers casting

当从引入float指针的整数引用时,我无法弄清楚如何转换引用的float指针的值。对不起,如果我的措辞不正确,我很抱歉。这是我的意思的一个例子:

#include <stdio.h>

main() {
    int i;
    float *f;

    i = 1092616192;

    f = (float *)&i;

    printf("i is %d and f is %f\n", i, *f);
}

f的输出为10。我是如何得到这个结果的?

3 个答案:

答案 0 :(得分:4)

通常,十六进制的1092616192的值为0x41200000。

在浮点数中,这将给你:

sign = positive (0b)
exponent = 130, 2^3 (10000010b)
significand = 2097152, 1.25 (01000000000000000000000b)

2 ^ 3 * 1.25 = 8 * 1.25 = 10

要解释指数部分使用偏移编码,因此您必须从中减去127以获得实际值。 130 - 127 = 3.由于这是二进制编码,我们使用2作为基础。 2 ^ 3 = 8。

要解释有效部分,首先要看一个看不见的整体&#39;值的最大值(最左边)是其中的一半,0.5。下一位是0.5,0.25的一半。因为只有0.25位和默认的&#39; 1&#39; bit置位,有效数表示1 + 0.25 = 1.25。

答案 1 :(得分:2)

你要做的是称为打字。它应该通过union或使用memcpy()来完成,并且只对没有填充位的sizeof(int) == sizeof(float)的架构有意义。结果高度依赖于体系结构:字节排序和浮点表示将影响重新解释的值。填充位的存在将调用未定义的行为,因为float 15.0的表示可能是类型int的陷阱值。

以下是获取与15.0对应的数字的方式:

#include <stdio.h>

int main(void) {
    union {
        float f;
        int i;
        unsigned int u;
    } u;

    u.f = 15;

    printf("re-interpreting the bits of float %.1f as int gives %d (%#x in hex)\n",
           u.f, u.i, u.u);

    return 0;
}

英特尔PC上的输出:

re-interpreting the bits of float 15.0 as int gives 1097859072 (0x41700000 in hex)

答案 2 :(得分:0)

您正在尝试预测未定义活动的后果 - 它取决于许多随机事物,以及您正在使用的硬件和操作系统。

基本上,你正在做的是在墙上扔一块玻璃并得到一块碎片。现在,您正在询问如何获得不同形式的碎片。好吧,你需要将玻璃以不同的方式扔在墙上......