Kopieren Bitmusters eines float
Wert in eine uint32_t
oder umgekehrt (nicht sie Guss), können wir Bits Byte-zu-Byte kopieren std::copy
oder memcpy
verwenden. Ein anderer Weg ist reinterpret_cast
zu verwenden, wie unten:Copy Bitmusters: float uint32_t
float f = 0.5f;
uint32_t i = *reinterpret_cast<uint32_t*>(&f);
oder
uint32_t i;
reinterpret_cast<float&>(i) = 10;
jedoch ein claim ist, die sagt, zwei reinterpret_cast
oben verwendete, nicht definiertes Verhalten aufzurufen.
Stimmt das? Wie?
Wie von der Antwort angegeben, ist es UB. Eine Aussage, dass "sizeof (uint32_t) == sizeof (float)" sollte alles sein, was Sie brauchen, um sicher zu sein, dass es funktioniert. – NathanOliver
@NathanOliver Aber wenn der Compiler typenbasierte Alias-Optimierungen durchführt, dann könnte es das Verhalten vernünftigerweise unterbrechen, wenn Sie '-fno-strict-aliasing' oder etwas nicht liefern. – TartanLlama
@TartanLlama Guter Punkt. Die Überprüfung von 'alignof' könnte ebenfalls erforderlich sein. – NathanOliver