Stellen Sie sich diese Situation vor. int32_t
ist ein erweiterter Integer-Typ und wird in Zweierkomplementendargestellt (als Standard wird int32_t
benötigt, um dargestellt zu werden). Dies bedeutet, dass INT32_MIN
ist -2147483648
( 0x80000000
).
Inzwischen ist int
ein Standard-Integer-Typ und wird in seinem Komplement dargestellt (wie es der Standard zulässt). Dies bedeutet, dass INT_MIN
ist -2147483647
.
Korrigiere mich jetzt, wenn ich falsch liege, aber ich denke, beide Typen haben die gleiche Breite , was nach 6.3.1.1.1 (Hervorhebung von mir):
Der Rang eines normalen Integer-Typs muss größer sein als der Rang eines erweiterten Integer-Typs mit der gleichen Breite .
Der Rang von int32_t
ist also niedriger als der von int
.
Jetzt 6.3.1.8 (übliche arithmetische Konvertierungen) sagt (Hervorhebung von mir):
& lt; ... & gt; Andernfalls werden die Integer-Promotions für beide Operanden ausgeführt. Dann ist die Folgende Regeln werden auf die hochgestuften Operanden angewendet: Wenn beide Operanden denselben Typ haben, ist keine weitere Konvertierung erforderlich. Andernfalls , wenn beide Operanden Integer-Typen signiert haben oder beide nicht signiert sind Integer-Typen, der Operand mit dem Typ des weniger ganzzahligen Conversion-Rangs ist konvertiert in den Typ des Operanden mit größerem Rang .
Also, wenn Sie es richtig verstehen, in diesem Codeblock:
%Vor% Im Ausdruck x + y
muss x
zu int
hochgestuft werden und INT32_MIN
ist außerhalb des Bereichs von int
.
Ist das ein Fehler im Standard oder fehlt mir etwas?
Mit anderen Worten, was bedeutet der Ausdruck x + y
in diesem Zusammenhang, wie durch den Standard definiert?
int32_t
ist optional. Eine konforme Implementierung kann kein 32-Bit-Einser-Komplement int
und 32-Bit Zweierkomplement-Extended-Integer-Typ int32_t
; Wenn int
das Einerkomplement ist, wird int32_t
höchstwahrscheinlich nicht bereitgestellt.
Hier ist ein Grund, warum das 32-Bit-Einser-Komplement int
und das 32-Bit-Zweierkomplement der erweiterte Integer-Typ int32_t
nicht koexistieren kann. Zitieren des N1570-Entwurfs :
7.20.2 Grenzen von Integer-Typen mit spezifizierter Breite
1 Die folgenden objektartigen Makros geben die minimalen und maximalen Grenzen der Typen an erklärt in
<stdint.h>
. Jeder Makroname entspricht einem ähnlichen Typ Name in 7.20.1.2 Jede Instanz eines definierten Makros soll durch eine Konstante ersetzt werden Ausdruck geeignet für die Verwendung in #if Preprocessing-Direktiven und dies Ausdruck muss den gleichen Typ haben wie ein Ausdruck, der ein ist Objekt des entsprechenden Typs konvertiert nach der ganzen Zahl Aktionen . Ihr umsetzungsdefinierter Wert soll gleich oder sein Größer (absoluter Wert) als der entsprechende Wert unten gegeben, mit dem gleichen Vorzeichen, außer wo angegeben genau zu sein gegebener Wert.
...
%Vor%
In der von Ihnen beschriebenen Situation muss INT32_MIN
genau den Wert -2 ^ 31 haben, aber aufgrund der ganzzahligen Werbeaktionen muss ein Typ vorhanden sein, der diesen Wert nicht enthalten kann. Dieser Widerspruch verhindert die Bereitstellung von int32_t
überhaupt.
In der Zwischenzeit ist int ein ganzzahliger Integer-Typ und wird in einem dargestellt ergänzen
Erweiterte Ganzzahlen sind Implementierungen definiert und müssen nur Binärzahlen sein, und vorzeichenbehaftete Ganzzahlen müssen im Zweierkomplement oder in der Zeichen- und Betragsnotation dargestellt werden
intxx_t ist ein int-Typ fester Größe und muss dieselbe Darstellung wie int haben. Da intxx_t ein Zweierkomplement ist, muss int gleich sein.
Tags und Links c type-conversion language-lawyer integer-promotion