int i = 10;
void *p = &i;
printf("%f\n", *(float*)p);
Run Code Online (Sandbox Code Playgroud)
float i=10.00;
void *p = &i; // no change
printf("%d\n", *(int*)p);
Run Code Online (Sandbox Code Playgroud)
为什么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;
}
Run Code Online (Sandbox Code Playgroud)
输出是
int repr: 0a 00 00 00
float repr: 00 00 20 41
Run Code Online (Sandbox Code Playgroud)
由此可见:
a)它是一个小的endian机器,因为int的最低字节首先出现在内存中b)int具有带字节的表示0a 00 00 00,所以值是0000000a,十六进制表示,10,c)浮点数是确实41200000.根据IEEE 754,这意味着你有一个符号位,8位指数和23位尾数.符号为0(+),指数为0x82,表示+3,尾数为010000...,表示二进制为1.01或十进制为1.25.
这些数据一起形成值2*2*2*1.25 = 8*1.25 = 10.