Wie wir wissen, ist ein vorzeichenbehafteter Ganzzahlüberlauf ein undefiniertes Verhalten . In der C ++ 11- cstdint
Dokumentation gibt es jedoch etwas Interessantes :
Ganzzahliger Typ mit Vorzeichen mit einer Breite von genau 8, 16, 32 bzw. 64 Bit ohne Auffüllbits und Verwendung des Zweierkomplements für negative Werte (nur bereitgestellt, wenn die Implementierung den Typ direkt unterstützt)
Und hier ist meine Frage: Da die Norm ausdrücklich sagt , dass für int8_t
, int16_t
, int32_t
und int64_t
negative Zahlen sind 2-Komplement, ist immer noch Überlauf dieser Art ein nicht definiertes Verhalten?
Bearbeiten Ich habe die C ++ 11- und C11-Standards überprüft und Folgendes gefunden:
C ++ 11, §18.4.1:
Der Header definiert alle Funktionen, Typen und Makros wie 7.20 im C-Standard.
C11, §7.20.1.1:
Der Typedef-Name
intN_t
bezeichnet einen vorzeichenbehafteten Integer-Typ mit der Breite N, keinen Füllbits und einer Zweierkomplementdarstellung. Somitint8_t
bezeichnet ein solcher vorzeichenbehaftete Ganzzahl - Typ mit einer Breite von genau 8 Bits.