C打印字符数组作为浮点

C打印字符数组作为浮点,c,floating-point,unions,C,Floating Point,Unions,我试图打印一个由4个元素组成的字符数组作为浮点数。编译器(gcc)不允许我编写z.s={'3','4','j','k'}

我试图打印一个由4个元素组成的字符数组作为浮点数。编译器(gcc)不允许我编写
z.s={'3','4','j','k'}
#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;
}
#包括
联合工会{
chars[4];
浮动x;
};
类型定义联合n;
内部主(空)
{
nz;
z、 s[0]='3';
z、 s[1]='4';
z、 s[2]='j';
z、 s[3]='k';
printf(“f=%f\n”,z.x);
返回0;
}
上面程序的输出是:
f=283135145630880207619489792.000000
,这是一个远大于浮点变量所能存储的数字;以科学符号表示,输出应为
4.1977085E-8

那怎么了?

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

一个单精度IEEE浮点可以存储的最大有限值是3.4028234×10^38,因此283135145630880207619489792.000000(约为2.8313514×10^26)是最确定的范围

假设你的角色在其他方面是正确的,下意识的猜测是你的endianness错了

编辑: 34jk如果从左到右取,如在big-endian机器上:

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

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

在little endian中:

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,这就是你的程序输出的值。这是一个安全的结论,你在一台小小的endian机器上


总结:机器之间的字节顺序是不同的。你想用另一种方式来使用你的字节-试试
kj43

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

,也许吧?你考虑过印度的大/小问题吗?我想任何x86或x86-64 PC都会给出同样的结果。如果我是你,我会用fwrite将这个数组写入一个文件,然后用fread作为浮点读取(读浮点数)这可以给你一个关于SudiaNess问题的提示,那么不同的编译器可以给出不同的结果吗?精度如何?我认为浮点尾数只能存储7位数字。不同的CPU肯定会给出不同的结果。当读取32位值时,一些人认为最重要的字节是第一位,但有些人认为它是T。他是最后一个。我想你刚才在一个小小的endian CPU(即从右到左读取的CPU)上使用了英语阅读顺序(即从左到右)。是的,是的,这是一个Linux x86-64,非常感谢!
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)