将void指针转换为float*/int*时取消引用

Ami*_*rma 2 c

一个

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,那么它的输出就是垃圾.

glg*_*lgl 5

为了更准确地了解其他人所说的,这是一个测试:

#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.