Ich fürchte, ich übersehe möglicherweise etwas Triviales, aber es scheint, dass es keinen wirklich sicheren Weg gibt, in/von einem vorzeichenbehafteten Typ zu konvertieren, wenn Sie den ursprünglichen vorzeichenlosen Wert beibehalten möchten.
Bei reinterpret_cast listet 5.2.10 keine Ganzzahl-in-Ganzzahl-Konvertierung auf, daher ist sie nicht definiert (und static_cast definiert keine zusätzliche Konvertierung). Bei ganzzahligen Konvertierungen besagt 4.7.3 grundsätzlich, dass die Konvertierung eines großen vorzeichenlosen Werts durch die Implementierung definiert (also nicht portierbar) sein wird.
Dies scheint eine Einschränkung zu sein, da wir beispielsweise wissen, dass ein uint64_t auf jeder Hardware sicher in einen int64_t und zurück konvertierbar sein sollte, ohne dass sich der Wert ändert. Außerdem garantieren die Regeln für Standard-Layout-Typen tatsächlich eine sichere Konvertierung, wenn wir zwischen den beiden Typen memcpy verwenden würden, anstatt sie zuzuweisen.
Liege ich richtig? Gibt es einen legitimen Grund, warum man nicht zwischen Integraltypen ausreichender Größe neu interpretieren kann?
Klarstellung: Auf jeden Fall ist die signierte Version des unsigned kein garantierter Wert, aber es ist nur der Roundtrip, den ich in Betracht ziehe (unsigned => signiert => unsigned)
UPDATE: Wenn ich mir die Antworten genau ansehe und den Standard gegenprüfe, glaube ich, dass die Funktion von memcpy nicht wirklich garantiert ist, da nirgendwo angegeben ist, dass die beiden Typen Layout-kompatibel sind, und auch keine Char-Typen. Bei einem weiteren Update sollte dieses Memcpy mit dem C-Standard funktionieren, da die Größe des Ziels groß genug ist und die Bytes kopiert werden.
ANTWORT: Es scheint keinen technischen Grund zu geben, warum reinterpret_cast diese Konvertierung nicht durchführen durfte. Für diese Integer-Typen fester Größe funktioniert garantiert ein memcpy, und tatsächlich kann jeder Zwischentyp verwendet werden, solange das Zwischenprodukt alle Bitmuster darstellen kann (Float-Typen können gefährlich sein, da es möglicherweise Trap-Muster gibt). Im Allgemeinen können Sie keine Standardlayouttypen speichern, diese müssen kompatibel sein oder vom Typ char sein. Hier sind die Ints etwas Besonderes, da sie zusätzliche Garantien haben.
Keine konforme Möglichkeit, signierte/nicht signierte Dateien derselben Größe zu konvertieren ⇐ C++
-
- Similar Topics
- Replies
- Views
- Last post
Mobile version