浮点指针被类型化为char指针时会发生什么?

int main() { float f = 12.2; char *p1; p1 = (char *)&f; printf ("%d", *p1); } 

这输出51。

你可以一个float*成一个char*就好了,这就是使用这样一个可能有问题的野兽。

当您取消引用它时,您只需获取第一部分的char表示(但请参阅下面的内容,以了解这意味着什么,它并不像您想象的那么清楚)。

如果你在谈论IEE754浮点数,IEEE754浮点数为12.2(abcd是八位字节):

 S EEEEEEEE MMMMMMMMMMMMMMMMMMMMMMM (sign, exponent, mantissa). 0 10000010 10000110011001100110011 a aaaaaaab bbbbbbbccccccccdddddddd 

最后的00110011是您所看到的51(0x33)。 你看到浮点数的最后一位的原因是因为它在内存中存储(在小端架构中):

 00110011 00110011 01000011 01000001 dddddddd cccccccc bbbbbbbb aaaaaaaa 

这意味着float*char* cast将指向dddddddd部分。

在big-endian架构上,你会得到aaaaaaaa位, 01000001或65(0x41)。

主要是EFraim所说的,除了你转换为char *之外,只有stackoverflow标记是错误的。

因此,您获得f内部表示的最低有效字节(在IEEE-754中)。

假设提到的其他问题已得到修复,那么您将获得该浮点数所遇到的任何位模式的整数版本。 浮点数具有相当复杂的编码,因此它与浮点数中的数字无关。

问题是:

当float被类型化为char指针时会发生什么

确切的答案是:

未定义的行为。

  1. 你转换为(char)而不是(char *)。
  2. 您将其打印为整数。
  3. 因此,您获得f地址的最低有效字节。

编辑:根据新标记,你真的将浮动表示截断为最不重要的字节(在小端机器上)