我试图通过指针将整数转换为浮点数。当我执行指针键入时,如下所示:
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?谢谢!
答案 0 :(得分:2)
当您转换指针类型并使用新指针访问对象时,您的C实现可能会尝试将数据 1 重新解释为新类型。但是,它将重新解释内存中的位。它不会转换值。 int
值10的编码是32位00000000000000000000000000001010。对于float
,这些位是值1¼•2 −146 的编码(假定最常见的编码float
用于您的C实现)。 float
的值是如此之小,以至于用%f
格式化时,它被舍入为零。
请勿使用指针转换来转换或重新解释数据。要在保留值(在给定格式的情况下尽可能多)的同时转换类型,请使用强制转换,例如float b = (float) a;
。 (在许多情况下,分配本身将以这种方式进行转换。)要在重新解释编码值的位的同时转换类型,请使用memcpy
(例如memcpy(&b, &a, sizeof b);
或并集)。为此,必须确保源对象和目标对象的大小相同,并且可能存在与实现相关的效果,因为并非所有C实现都以相同的方式对值进行编码。
float
和int
是四个字节(在您的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;
这是您要做什么吗?