2011-12-09 23 views
5

Chcę typecast a float jako int. Nie robi to jednak kopi po trochu. Czy możliwe jest typowanie adresu float do postaci int przy zachowaniu wszystkich bitów (znak, wykładnik, mantysa)?Typacasting bit bit copy

+0

Może to działać tylko wtedy, gdy 'sizeof (float) <= sizeof (int)'. Nie mam ochoty na szukanie odpowiedzi, jeśli gwarantuje to język. –

Odpowiedz

3

Większość języków pozwoli coś takiego w C jak to jest:

float f = 3.14f; 
int i = *(int*)&f; 
+0

To jest cudowne! Dokładnie to, czego szukam! –

+0

Chociaż może to bardzo dobrze działać w większości przypadków, uruchamia ostrzeżenie w GCC, ponieważ narusza ścisłe aliasing - co jest technicznie niezdefiniowanym zachowaniem. – Mysticial

+0

To ciekawe - nie spowodowało to ostrzeżenia w moim GCC (4.4.3)? –

4

To nie jest możliwe, aby to zrobić w zupełnie C zgodny sposób, ale można użyć związki:

union{ 
    int i; 
    float f; 
} u; 

u.f = 123.456; // Your value. 

// Read u.i. 

ta powinna nadal działać na prawie wszystkich systemów dzisiaj. I oczywiście zakłada, że ​​float imają ten sam rozmiar.

Alternatywą jest użycie odlewania wskaźnika, ale mówiąc ściśle, które narusza ścisłe aliasing i jest uważane za niezdefiniowane zachowanie.


Innym (być zgodny - patrz komentarze) sposobem jest użycie memcpy():

int i; 
float f; 

f = 123.456; // Your value. 

memcpy(&i, &f, sizeof(int)); 

// Read i 
+0

Uważam, że jest to nieokreślone zachowanie (o którym wspominasz w swoim pierwszym zdaniu, choć z niedowierzaniem). Dodatek J1 do C99 stwierdza "Następujące są nieokreślone: ​​... wartość członka związku innego niż ostatni zapisany w". Niespecyficzne znajduje się pomiędzy zachowaniem zdefiniowanym przez implementację i niezdefiniowanym - implementacja nie musi dokumentować, w jaki sposób dokonuje się wyboru, co do wyników. Mimo to nie ma innego (C-C) bezpiecznego sposobu na zrobienie tego, więc +1. – paxdiablo

+0

Ale o ile wiem, gcc gwarantuje, że typowanie przez związki działa z nim, więc jeśli nie musi być przenośne, jest w porządku. –

+0

Co z memcpy? –