A
int i = 10;
void *p = &i;
printf("%f\n", *(float*)p);
B
float i=10.00;
void *p = &i; // no change
printf("%d\n", *(int*)p);
为什么 A 打印 0.0,而不是 10.0?如果我们把A改为B,那么它的输出就是垃圾。
为了更准确地了解其他人所说的,这里有一个测试:
#include <stdlib.h>
int main()
{
int a = 10;
float b = 10;
char * p;
p = &a;
printf("int repr: %02x %02x %02x %02x\n", p[0], p[1], p[2], p[3]);
p = &b;
printf("float repr: %02x %02x %02x %02x\n", p[0], p[1], p[2], p[3]);
return 0;
}
输出是
int repr: 0a 00 00 00
float repr: 00 00 20 41
由此可见:
a) 这是一个小端机器,因为 int 的最低字节在内存中首先出现
b) int 具有字节表示0a 00 00 00
,所以值为0000000a
,10 的十六进制表示。
c) 浮动确实是41200000
。根据IEEE 754 https://en.wikipedia.org/wiki/IEEE_floating_point,这意味着您有 1 个符号位、8 位指数和 23 位尾数。符号为 0 (+),指数为0x82
,意思是+3,尾数是010000...
,表示二进制为 1.01 或十进制为 1.25。
这些数据共同构成值 2*2*2*1.25 = 8*1.25 = 10。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)