【问题标题】:Convert integer to float via pointer通过指针将整数转换为浮点数
【发布时间】:2018-11-29 20:45:48
【问题描述】:

我试图通过指针将整数转换为浮点数。当我按如下方式进行指针类型转换时:

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?谢谢!

【问题讨论】:

  • 你为什么期望得到10.0
  • 提示:调试浮点输出时,请使用"%e",而不是"%f"。指数符号提供的信息更丰富。

标签: c pointers casting


【解决方案1】:
  1. 当您转换指针类型并使用新指针访问对象时,您的 C 实现可能会尝试将 data1 重新解释为新类型。但是,它重新解释了内存中的位;它不会转换值。 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 通常,您不应将指针转换为重新解释数据。有一些例外,特别是您可以使用字符类型来访问对象的数据。

【讨论】:

  • 您好,Eric,您的回答真的很有帮助,这正是我正在寻找的!非常感谢!顺便说一句,你能解释一下你是如何将 00000000000000000000000000001010 转换为小数的吗?我知道将二进制转换为十进制的一般规则,但是由于这个数字的指数是 0,我完全不知道如何进行转换......再次感谢!
  • @ottersailor:我有关于如何解码 IEEE-754 基本 32 位二进制编码 herehere 的答案。虽然我实际所做的是将printf%a 一起使用,它以“十六进制浮点”格式显示值,从中很容易读取2 的幂。
  • 谢谢埃里克。链接很有帮助!!
【解决方案2】:

您没有将 int 10 转换为浮点数。相反,您将 b 指针设置为等于 a 的地址。没有进行铸造。您的演员完成的唯一一件事就是关闭错误检查。

你想要什么?如果您希望 b 持有指向 10 的浮点表示的指针,那么您需要这样做:

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

这就是你想要做的吗?

【讨论】:

  • @MFisherKDX:同意。我添加了一个单独浮动的声明。
【解决方案3】:

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

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

【讨论】:

    猜你喜欢
    • 2012-09-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多