int32_t x = (int32_t)y;
ist kein Überlauf und nicht UB. Überlauf ist, wenn eine arithmetische Operation ein Ergebnis außerhalb des Bereichs der darstellbaren Werte erzeugt. Eine Konvertierung ist jedoch keine arithmetische Operation.
Diese Situation ist implementierungsdefiniertes Verhalten. Alle Implementierungen, von denen ich weiß, definieren das Verhalten so, dass sie die Repräsentation nicht verändern.
Beachten Sie, dass hier kein Cast erforderlich ist. Sie können int32_t x = y;
schreiben.
In der Praxis ist dies einfacher und wird immer funktionieren. So viel Code verlässt sich darauf, dass kein Anbieter jemals ein anderes Verhalten definieren wird (nicht, dass sie irgendeinen Grund dafür haben).
int32_t x = *(int32_t*)&y
ist nicht UB. Es verletzt kein striktes Aliasing, da die signierte Version eines Typs die unsignierte Version als Alias verwenden darf. Dieser Code erzeugt garantiert die int32_t
mit der gleichen Repräsentation wie die entsprechende uint32_t
(d. H. "Wrapping", da diese Typen garantiert das Zweierkomplement sind).
Tags und Links c++ undefined-behavior