当从引入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
。我是如何得到这个结果的?
答案 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)
您正在尝试预测未定义活动的后果 - 它取决于许多随机事物,以及您正在使用的硬件和操作系统。
基本上,你正在做的是在墙上扔一块玻璃并得到一块碎片。现在,您正在询问如何获得不同形式的碎片。好吧,你需要将玻璃以不同的方式扔在墙上......