浮点指针被类型化为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指针时会发生什么
确切的答案是:
未定义的行为。
- 你转换为(char)而不是(char *)。
- 您将其打印为整数。
- 因此,您获得f地址的最低有效字节。
编辑:根据新标记,你真的将浮动表示截断为最不重要的字节(在小端机器上)