C打印字符数组作为浮点
我试图打印一个由4个元素组成的字符数组作为浮点数。编译器(gcc)不允许我编写C打印字符数组作为浮点,c,floating-point,unions,C,Floating Point,Unions,我试图打印一个由4个元素组成的字符数组作为浮点数。编译器(gcc)不允许我编写z.s={'3','4','j','k'}
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;
}
#包括
联合工会{
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)