指鹿为马

第三课

只要敢玩,理论上你可以随意指定指针类型愚弄 C 编译器,让它相信你所说的都是真的,你说鹿是马,C 编译器便对此坚信不疑,我们来看看这门 “指鹿为马” 的艺术:

指 int 为 float

int i = 37;
float f = *(float *)&i;
// &i            => 取 i 的地址,类型为 int *
// (float *)&i    => 指鹿为马 -- 假装它是个 float *
// *(float *)&i    => 取出 float* 所指的值,类型为 float
// 以上实现了指 int 为 float,因为本质上它们都是 4 个字节排列在一起

printf("%f \n", f); // 0.000000 

// i: 00000000 00000000 00000000 00100101
// f: 00000000 00000000 00000000 00100101

// 1.00000000xxxxxx * 2^(-127) 约等于 0

指 float 为 short

float f = 7.0;
short s = *(short *)&f;
// &f             => 取 f 的地址,类型为 float *
// (short *)&f     => 指鹿为马 -- 假装它是个 short *
// *(short *)&f => 取出 short * 所指的值,类型为 short

printf("%s \n", s); // 输出结果视 endianness 而定

// Big Endian:
// f: 01000000 11100000 00000000 00000000
// s: 01000000 11100000                 

// Little Endian:
// f: 01000000 11100000 00000000 00000000
// s:                   00000000 00000000

指 double 为 char

数组与指针算术(pointer arithmetic)

结构体

如下图所示:

参考资料

Last updated