通过指针将整数转换为浮点数

时间:2018-11-29 20:45:48

标签: c pointers casting

我试图通过指针将整数转换为浮点数。当我执行指针键入时,如下所示:

int main()
{
    int a = 10;
    float* b;

    b = (float*)&a;

    printf("b = %f\n", *b);

    return 0;
}

结果是

b = 0.000000

在我的平台上,float和int均为4位。谁能让我知道为什么我不能得到b = 10.0?谢谢!

3 个答案:

答案 0 :(得分:2)

  1. 当您转换指针类型并使用新指针访问对象时,您的C实现可能会尝试将数据 1 重新解释为新类型。但是,它将重新解释内存中的位。它不会转换值。 int值10的编码是32位00000000000000000000000000001010。对于float,这些位是值1¼•2 −146 的编码(假定最常见的编码float用于您的C实现)。 float的值是如此之小,以至于用%f格式化时,它被舍入为零。

  2. 请勿使用指针转换来转换或重新解释数据。要在保留值(在给定格式的情况下尽可能多)的同时转换类型,请使用强制转换,例如float b = (float) a;。 (在许多情况下,分配本身将以这种方式进行转换。)要在重新解释编码值的位的同时转换类型,请使用memcpy(例如memcpy(&b, &a, sizeof b);或并集)。为此,必须确保源对象和目标对象的大小相同,并且可能存在与实现相关的效果,因为并非所有C实现都以相同的方式对值进行编码。

  3. floatint是四个字节(在您的C实现中),而不是四个位。

注意

1 通常,不应转换指针来重新解释数据。对此有一些例外,特别是您可以使用字符类型来访问对象的数据。

答案 1 :(得分:0)

您不是将 10从int转换为float,而是将int表示转换为值10转换为浮点数。

整数通常存储为一个简单的字节序列,基本上以基数256中的数字形式存储。另一方面,浮点类型具有非常不同的表示形式,通常为IEEE 754

答案 2 :(得分:0)

您没有将int 10转换为float。而是将b指针设置为等于a的地址。没有铸造。您的演员表唯一要做的就是关闭错误检查。

您想要什么?如果要让b保持指向浮点表示形式10的指针,则需要执行以下操作:

float b_float;
bptr = &b_float;
*bptr = (float) a;

这是您要做什么吗?