簡體   English   中英

C將char數組打印為float

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM