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.
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
@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
@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. –