[英]C printing char array as float
我正在嘗試將4個元素的char數組打印為浮點數。 編譯器(gcc)不允許我寫zs={'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
,這個數字遠遠大於float變量可以存儲的數字; 輸出應以科學計數法為4.1977085E-8
。 那有什么不對?
zs={'3','4','j','k'};
將一個數組分配給另一個數組。 C不允許這樣做,盡管您可以將第二個和memcpy
聲明為第一個。
單精度IEEE浮點型可以存儲的最大有限值為3.4028234×10 ^ 38,因此283135145630880207619489792.000000 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,這是程序輸出的結果。 這是一個安全的結論,說明您使用的是小型Endian計算機。
總結:機器之間的字節順序是不同的。 您想以其他方式使用字節—試試kj43
。
您實際看到的是{'k''j''4''3'}
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.