Jak przekonwertować lub rzutować zmiennoprzecinkowe na sekwencję bitów, taką jak dłu

Dzień dobry, pracuję w 16-bitowym środowisku C i chcę przekonwertować wartość zmiennoprzecinkową na jej sekwencję bitową, taką jak liczba całkowita. Wiem, jak to osiągnąć, na wiele sposobów, jednym jest związek; Jak na przykład

union ConvertFloatToInt
{  
   float input;  
   unsigned long  output;  
};

spowoduje to „konwersję” wartości zmiennoprzecinkowych na długą wartość poprzez odczytanie tego samego obszaru pamięci, po prostu interpretowanie go inaczej.

union ConvertFloatToInt x;
x.input = 20.00;

wyni

x.output = 0x41A00000;

Inne metody to rzutowanie pustych wskaźników ...

float input = 40.00;
unsigned long output;
void* ptr;
ptr = &input;
output = *(unsigned long*) ptr;

wyni

output = 0x42200000;

To jest idea tego, co próbuję zrobić, jednak chcę, aby kompilator wykonał dla mnie konwersję podczas kompilacji, a nie w czasie wykonywani

Potrzebuję wstawić przekonwertowane dane zmiennoprzecinkowe do stałej (stałej) bez znaku długiej.

Myślałem o próbie przekształcenia wartości zmiennoprzecinkowej w pustkę, a następnie pustkę w niepodpisany długi. Coś takiego: (i tak, to jest niepoprawne, nie można przesłać w pustkę)

const unsigned long FloatValue = (unsigned long) ((void) ((float) 20.654));

Czy jest jakiś sposób, aby to zrobić? Myślałem o czymś z pustymi wskaźnikami, ale wszystkie znane mi puste wskaźniki potrzebują zmiennej, a zmiennych nie można używać do przypisywania stałych wartości.

Edytowa

Korzystam z kompilatora C90. Pytanie jest przeznaczone do zakresu pliku.

Wniose

Wniosek był taki, że nie ma realnego rozwiązania tego pytania, z wyjątkiem pracy w zakresie blokowym. Za które udzielono wielu odpowiedzi i dziękuję wam wszystkim.

Moje rozwiązanie

To nie jest dobre rozwiązanie, jednak rozwiązuje mój problem, ale nie sądzę, aby to pomogło wielu osobom. Stworzyłem mały program do celów demonstracyjnych. To nie jest kod moich projektów, a także kompilator używany w moim projekcie (zanim ktoś powie, że to nie jest kompilator C90)

Kompilator użyty w demonstracji: gcc (Ubuntu / Linaro 4.6.3-1ubuntu5) 4.6.3

typedef union
{
            float myfloat;
            unsigned long mylong;
} custom_type;

typedef struct
{
            int a;
            int b;
            custom_type typeA;
            custom_type typeB;
} my_struct;

const my_struct myobj =
{
                            1,2,3.84F,4
};

int main(void)
{
            printf(":: %f\n", myobj.typeA.myfloat);
            printf(":: %ul\n", myobj.typeA.mylong);
            return 0;
}

Wydajnoś

:: 3.840000
:: 1081459343l

Jest to trochę prymitywne, jednak działa w zakresie plików (ale generuje ostrzeżenia

questionAnswers(5)

yourAnswerToTheQuestion