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
Odpowiedz
Większość języków pozwoli coś takiego w C jak to jest:
float f = 3.14f;
int i = *(int*)&f;
To jest cudowne! Dokładnie to, czego szukam! –
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
To ciekawe - nie spowodowało to ostrzeżenia w moim GCC (4.4.3)? –
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
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
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. –
Co z memcpy? –
Można użyj numeru union.
union
{
int tmp;
float f;
} u;
u.f = z;
Następnie u.tmp
to te same bity. (Kod pobrany z this Wikipedia article).
- 1. .net InstallUtil - 32 bit vs 64 bit
- 2. C/C++ Bit Array lub Bit Vector
- 3. Jak wydrukować jeden bit?
- 4. Bit zmiany w C++
- 5. Bit Striping w C
- 6. Bit Reversal bitwise
- 7. Java Crit-bit Trees
- 8. Ifstream - Resetuj bit EOF
- 9. SQL - Integer Type - Detect bit
- 10. Zliczanie inwersji za pomocą BIT
- 11. Bit ekstraktu w Ruby Integers
- 12. Odwróć 1 bit w C#
- 13. Skompiluj ASP.NET do 64 BIT
- 14. Obrót Tablice non-bit Julia
- 15. Błędne uprawnienia ustawia lepki bit
- 16. BIT: Używanie binarnie indeksowanego drzewa?
- 17. C# przekonwertuj bit na boolean
- 18. Start Bit vs Start Byte
- 19. Integer to Bit w SQL
- 20. W jaki sposób używać operatora bit/bit do sterowania stanem obiektu?
- 21. Jak uzyskać bezwzględną ścieżkę z pliku zależy na windows 32-bit lub 64-bit maszyna
- 22. Konwersja 24-bitową BMP 16-bit?
- 23. Jak zainstalować cmake na Windows 64 bit
- 24. Boost :: Python Windows 7 64 Bit
- 25. Łączenie bit flagi w klasie stałej PHP
- 26. Najlepszy sposób konwersji INT do BIT
- 27. Jak sprawdzić, czy bitmask zawiera bit?
- 28. Jak rozbroić określony bit w liczbie całkowitej
- 29. D Automatyczna Błędy (64 bit problem?)
- 30. svn: jak ustawić wykonywalny bit na pliku?
Może to działać tylko wtedy, gdy 'sizeof (float) <= sizeof (int)'. Nie mam ochoty na szukanie odpowiedzi, jeśli gwarantuje to język. –