2

我正在尝试将 4 个元素的 char 数组打印为浮点数。编译器(gcc)不允许我写z.s={'3','4','j','k'};main() 函数,为什么?

#include <stdio.h>

union n{
    char s[4];
    float x;
};
typedef union n N;

int main(void)
{
    N z;
    z.s[0]='3';
    z.s[1]='4';
    z.s[2]='j';
    z.s[3]='k';
    printf("f=%f\n",z.x);
    return 0;
}

上面程序的输出是:f=283135145630880207619489792.000000,一个远大于浮点变量可以存储的数字;以科学计数法,输出应该是4.1977085E-8. 那么有什么问题呢?

4

2 回答 2

6

z.s={'3','4','j','k'};会将一个数组分配给另一个数组。C 不允许这样做,尽管您可以声明第二个和memcpy第一个。

单精度 IEEE 浮点可以存储的最大有限值是 3.4028234 × 10^38,因此 283135145630880207619489792.000000,大约为 2.8313514 × 10^26 绝对在范围内。

假设您的字符在其他方面是正确的,那么下意识的猜测是您的字节顺序错误。

编辑:如果从左到右取 34jk,因为在大端机器上是:

0x33 0x34 0x6a 0x6b
= 0011 0011, 0011 0100, 0110 1010, 0110 1011

所以:

sign = 0
exponent = 011 0011 0 = 102 (dec), or -25 allowing for offset encoding
mantissa = [1] 011 0100 0110 1010 0110 1011 = 11823723 / (2^23)

所以这个值大约是 4.2 × 10^-8,这就是你想要的。

在小端:

0x6b 0x6a 0x34 0x33 
= 0110 1011, 0110 1010, 0011 0100, 0011 0011

sign = 0
exponent = 110 1011 0 = 214 (dec) => 87
mantissa = [1]110 1010 0011 0100 0011 0011 = 15348787 / (2^23)

所以这个值大约是 2.8 * 10^26,这是你的程序输出的。这是一个安全的结论,你在一个小端机器上。

然后总结:机器之间的字节顺序不同。你想以相反的方式使用你的字节——试试kj43.

于 2012-08-18T16:50:18.930 回答
1

你实际看到的是 {'k' 'j' '4' '3'}

于 2013-01-30T18:57:47.147 回答