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

时间:2009-07-16 05:20:32

标签: c casting

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

这输出51。

6 个答案:

答案 0 :(得分:17)

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

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

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

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

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

00110011 00110011 01000011 01000001
dddddddd cccccccc bbbbbbbb aaaaaaaa

这意味着char*的{​​{1}}广告会指向float*部分。

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

答案 1 :(得分:1)

  1. 您转换为(char)而不是(char *)。
  2. 您将其打印为整数。
  3. 因此,您获得f地址的最低有效字节。
  4. 编辑:根据新标记,你真的将浮动表示截断为最不重要的字节(在小端机器上)

答案 2 :(得分:1)

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

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

答案 3 :(得分:1)

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

答案 4 :(得分:1)

问题是:

  

将float命名为char指针

时会发生什么

确切的答案是:

  

未定义的行为。

答案 5 :(得分:0)

您的问题与我的主题略有偏差,我通常在这种情况下将snpritf Example:转换为fisrt格式,然后才能播放格式化的缓冲区。