Was ist (INT32_MIN + 1), wenn int32_t ein erweiterter Integer-Typ ist und int ein 32-Bit-Einerkomplement-Standard-Integer-Typ ist

8

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?

    
MarkWeston 28.12.2017, 17:18
quelle

2 Antworten

12

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.

    
user2357112 28.12.2017, 18:10
quelle
-5
  

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.

    
PeterJ_01 28.12.2017 17:20
quelle