2015-08-10 10 views
5

In einem 128-Bit-RISC-V (oder einem anderen 128-Bit-Rechner), wie groß sind die Datentypen "long" und "long long" in C/C++?Größe von "lang lang" in 128-Bit-Maschine?

Um zu verdeutlichen: Was sind die Größen, die ein Implementierer eines Compilers beim Schreiben der limits.h-Datei für eine solche Maschine erwarten könnte, ohne dass andere Implementierungen konform sind?

Antwort

8

Sie können jede Größe der Compiler Schriftsteller wollte, unterliegen sie mindestens so groß ist wie ihre Vorgängertyp sein (long int für long long int und int für long int) und erfüllt die Mindestbereiche in den Normen.

Siehe zum Beispiel 5.2.4.2 Numerical limits in C11, in dem es heißt, den Mindest Bereich erforderlich:

long int 
    LONG_MIN   -2147483647 // −(2^31 − 1) 
    LONG_MAX   +2147483647 // 2^31 − 1 
long long int 
    LLONG_MIN -9223372036854775807 // −(2^63 − 1) 
    LLONG_MAX +9223372036854775807 // 2^63 − 1 

Beachten Sie, dass diese nicht Ihr voll Zweierkomplement-Bereich, da sie für den anderen zu berücksichtigen haben zwei Codierungsschemata, Einerkomplement und Vorzeichengröße, die beide das Konzept der negativen Null haben.

Wenn Sie wirklich wissen wollen, können Sie nur diese Werte in der limits.h Header-Datei suchen oder kompilieren und ausführen:

#include <stdio.h> 
#include <limits.h> 

int main (void) { 
    printf ("BITS/CHAR %d\n", CHAR_BIT); 
    printf ("CHARS/SHORT %d\n", sizeof(short)); 
    printf ("CHARS/INT %d\n", sizeof(int)); 
    printf ("CHARS/LONG %d\n", sizeof(long)); 
    printf ("CHARS/LLONG %d\n", sizeof(long long)); 
    putchar ('\n'); 

    printf ("SHORT MIN %d\n", SHRT_MIN); 
    printf ("SHORT MAX %d\n", SHRT_MAX); 
    printf ("INT MIN %d\n", INT_MIN); 
    printf ("INT MAX %d\n", INT_MAX); 
    printf ("LONG MIN %ld\n", LONG_MIN); 
    printf ("LONG MAX %ld\n", LONG_MAX); 
    printf ("LLONG MIN %lld\n", LLONG_MIN); 
    printf ("LLONG MAX %lld\n", LLONG_MAX); 
    return 0; 
} 

Auf meinem System eine ziemlich Morast-Standard ein (und leicht umformatiert sehen ziemlich):

BITS/CHAR  8 
CHARS/SHORT 2 
CHARS/INT  4 
CHARS/LONG  4 
CHARS/LLONG 8 

SHORT MIN     -32768 
SHORT MAX     32767 
INT MIN    -2147483648 
INT MAX    2147483647 
LONG MIN    -2147483648 
LONG MAX    2147483647 
LLONG MIN -9223372036854775808 
LLONG MAX 9223372036854775807 

So wie es aussieht, auf diesem System habe ich zweier-Komplement (die 8/7 Mismatch auf die letzte Stelle der negativen/positiven Zahlen), keine Füllbits, 16-Bit-short int, 32 -bit int und long int und 64-Bit long long int.

Wenn Sie ähnlichen Code in Ihrer eigenen Umgebung ausführen, sollte das in der Lage sein, Ihnen ähnliche Informationen zu geben.

+2

Es gibt eine zweite Einschränkung für die Größe von 'long long': Es muss mindestens 64 Bit sein. Das garantiert der C-Standard. – cmaster

+1

@cmaster: tatsächlich wird der Ausdruck "64 Bits" nur dreimal in C11, zweimal in Bezug auf das Fließkommaformat nach IEC 60559 und einmal für die Ganzzahltypen mit exakter Breite gesehen. Es wird überhaupt nicht für die normalen Integer-Typen erwähnt, obwohl Sie die Bereiche extrapolieren könnten (die * angegeben sind), um anzuneh- men, dass 64 Bits benötigt werden. Aber es sind die * Bereiche *, die spezifisch vorgeschrieben sind, anstatt die Breite. Natürlich könnte ich mich irren, es wäre nicht das erste Mal. Aber ich würde eine Empfehlung des Standards benötigen, um mich zu überzeugen :-) – paxdiablo

+1

@paxdiablo: Das C11 definiert _bit_ in § 3.5 als Einheit, die groß genug ist, um zwei Werte zu halten. Es erwähnt auch den Term _mathematisch definiert in §6.5/p5. Durch reine Mathematik können Sie genau '2^n' eindeutige Werte in' n'-Bit-Entitäten speichern. Der _minimum_-Bereich von 'long long int' beinhaltet' abs (LLONG_MIN) + LLONG_MAX + 1' eindeutige Werte (extra eins für Null)). Das Ergebnis von ceil (log2 (abs (LLONG_MIN) + LLONG_MAX + 1)) ist 64, daher ist es die minimale Breite in Bits für diesen Typ. Beachten Sie, dass dies nicht notwendigerweise acht Bytes impliziert, da 'CHAR_BIT' implementierungsdefiniert ist und von acht abweichen kann. –

-1

Nach der Norm, die genannten nicht-numerische Signed Integer-Typen sind:

Type name  Possible size 
signed char — 8 
short   — 16 
int   — 32 
long   — 64 
long long  — 128 
intmax_t  — 256 

(von 'nicht-numerischen', ich meine ignorieren int_least8_t, int_fast16_t und int32_t, etc.)

Die aufgelisteten Größen sind nicht diejenigen, die durch den C-Standard vorgeschrieben sind, aber sie sind eine Standardprogression mit doppelt so vielen Bits in jedem aufeinanderfolgenden Typ. Auf einer 128-Bit-Maschine wäre es vernünftig anzunehmen, dass long long 128 Bits lang wäre. Wenn der Compiler-Schreiber 256-Bit-Typen unterstützen wollte, wäre es nicht ungewöhnlich, intmax_t zu einem 256-Bit-Typ zu machen. Aber darüber hinaus sind dir die Namen ausgegangen. Normalerweise haben einige dieser Typen dieselben Größen.

die alle Standards erfordern, ist die nicht-Typ weiter oben in der Liste ist länger als eine Art später in der Liste, das char mindestens 8 Bits sind, dass short und int sind mindestens 16 Bits, dass long mindestens 32 ist Bits, und das long long ist mindestens 64 Bits.

+1

Wo hast du gesehen, dass lang lang 128bit im Standard ist? Ich kann nur feststellen, dass es mindestens 64bit ist. – galinette

+0

@galinette: Der Standard sagt nur "Minimum 64 Bits". Das 128-Bit-Beispiel stammt von einem hypothetischen 128-Bit-CPU-Typ. –

0

Fügen Sie den Header limits.h ein und drucken Sie die Größe des gewünschten Typs aus.

#include <limits.h> 

int main() { 

printf ("Size of long long is : %d\n", sizeof(long long)); 

return 0; 
}