Sind die Integer-Typen mit fester Breite garantiert typedefs für die standardmäßigen eingebauten Typen?

8

Sind die Typen von <cstdint> (wie zB int16_t , uint_fast64_t , int_least8_t ) garantiert typedef s für einen der eingebauten Typen wie short , unsigned long usw.?

Oder ist es einer Implementierung erlaubt, Typen zu verwenden, die nicht zu den üblichen gehören, um die Typen mit fester Breite zu implementieren?

    
Baum mit Augen 24.06.2015, 21:51
quelle

4 Antworten

2

Diese werden vom C-Standard spezifiziert (und durch den C ++ - Standard durch Bezugnahme eingeschlossen), der erfordert, dass jeder ein typedef für einen vorzeichenbehafteten Integer-Typ oder vorzeichenlosen Integer-Typ je nachdem.

signed integer type ist wiederum so definiert, dass die Kernsprache aus den Standard-Integer-Typen mit Vorzeichen besteht (die signed char , short int , int , long int und long long int ) und alle implementierungsdefinierten erweiterten signierten Integer-Typen .

Entsprechend wird vorzeichenloser Integer-Typ durch die Kernsprache definiert, die aus den standardmäßigen Ganzzahlarten ohne Vorzeichen besteht (die unsigned char , unsigned short int , unsigned int , unsigned long int und unsigned long long int ) und alle implementierungsdefinierten erweiterten vorzeichenlosen Ganzzahl-Typen , die den erweiterten Ganzzahl-Typen mit Vorzeichen entsprechen.

Kurz gesagt, jeder dieser typedefs kann einer der üblichen eingebauten Typen oder ein implementierungsdefinierter erweiterter Integer-Typ sein. Die meisten Compiler unterstützen keine erweiterten Integer-Typen, daher müssen sie bei diesen Compilern eingebaute Typen sein.

    
T.C. 24.06.2015, 22:08
quelle
3

Nein, zumindest nicht für die Typen intN_t . Diese Typen haben garantiert eine Zweierkomplementdarstellung (gemäß C99 7.18.1.1, die Referenz C ++ 11 und C ++ 14). Und Standard-Integer-Typen müssen nicht Zweierkomplement sein.

C11 hat auch eine wichtige Änderung gegenüber C99 (was eigentlich nur Bugfix ist), was den obigen Punkt betont:

7.20.1.1/3:

  

Wenn jedoch eine Implementierung Integer-Typen mit bereitstellt   Weiten von 8, 16, 32 oder 64 Bit, keine Padding-Bits, und (für die signierten Typen), die a   Zweierkomplement-Darstellung , definiert sie die entsprechenden typedef-Namen.

    
Anton Savin 24.06.2015 22:16
quelle
2

Ich habe einen Entwurf der C99-Spezifikation vor mir und einen Entwurf der C ++ 14-Spezifikation. Da es sich um Entwürfe handelt, könnten diese Informationen falsch sein, aber ich glaube, dass der Wortlaut in der endgültigen Fassung derselbe ist.

In der C ++ 14-Spezifikation sagt § 18.4.1 Folgendes über <cstdint> :

%Vor%

Es sagt dann

  

Der Header definiert alle Funktionen, Typen und Makros wie im C-Standard 7.18.

Ich ging zum Entwurf des C99-Standards, §7.18, und sah nichts, was die definierten Typen benötigte, um Aliase für eingebaute Typen wie int , long int usw. zu sein. Es sagte nur, wenn diese Typen existieren Sie müssen bestimmte Beschränkungen hinsichtlich ihrer Bereiche, Größen und Speicherlayouts erfüllen.

Insgesamt vermute ich stark, dass die Antwort "nein" ist, aber wenn ich mich irre, interessiert mich, wo ich die Spezifikation falsch gelesen habe. : -)

Hoffe, das hilft!

    
templatetypedef 24.06.2015 22:07
quelle
1

Aus dem C ++ - Standard: "Es können auch implementation-defined, extended signed integer types vorhanden sein. Die Integer-Typen für Standard und Extended signed werden gemeinsam als Ganzzahlen mit Vorzeichen bezeichnet.". (Ich denke, es gibt eine ähnliche Zeile über erweiterte vorzeichenlose Integer-Typen.) Es wird nicht gesagt, wie Sie diese erweiterten Integer-Typen verwenden würden, sie sind offensichtlich nicht portierbar und die Implementierung ist definiert.

int16_t usw. kann jedoch typedefs für erweiterte Integer-Typen sein.

    
gnasher729 24.06.2015 22:04
quelle

Tags und Links