Die Standards sagen nichts über die genaue Größe von Integer-Typen außer char
aus . Normalerweise long
ist 32-Bit auf 32-Bit-Systemen und 64-Bit auf 64-Bit-Systemen.
Der Standard gibt jedoch ein Minimum vor Größe. Aus Abschnitt 5.2.4.2.1 des C-Standards:
1 Die unten angegebenen Werte müssen durch konstante Ausdrücke ersetzt werden, die für die Verwendung in #if
geeignet sind Vorverarbeitungsanweisungen. Außerdem außer CHAR_BIT
und MB_LEN_MAX
, werden die folgenden Ausdrücke durch Ausdrücke ersetzt, die den gleichen Typ haben wie ein Ausdruck, der ein Objekt des entsprechenden Typs ist, der gemäß den Integer-Promotions konvertiert wurde. Ihre implementierungsdefinierten Werte müssen in der Größenordnung (Absolutwert) gleich oder größer sein als die angezeigten, mit demselben Vorzeichen.
...
-
Mindestwert für ein Objekt vom Typ
long int
LONG_MIN
-2147483647 // −(2^31−1) -
Maximalwert für ein Objekt vom Typ
long int
LONG_MAX
+2147483647 // 2^31−1
Dies besagt, dass ein long int
muss mindestens 32 Bit sein, kann aber größer sein. Auf einem Computer, auf dem CHAR_BIT
8 ist, ergibt dies eine minimale Bytegröße von 4. Auf Maschinen mit z. CHAR_BIT
gleich 16, ein long int
könnte 2 Bytes lang sein.
Hier ist ein Beispiel aus der Praxis. Für den folgenden Code:
#include <stdio.h>
int main ()
{
printf("sizeof(long) = %zu\n", sizeof(long));
return 0;
}
Ausgabe auf Debian 7 i686:
sizeof(lang) =4
Ausgabe auf CentOS 7 x64:
sizeof(lang) =8
Also nein, Sie können keine Annahmen über die Größe treffen. Wenn Sie einen Typ mit einer bestimmten Größe benötigen, können Sie die in stdint.h
definierten Typen verwenden . Es definiert die folgenden Typen:
int8_t
:signiertes 8-Bituint8_t
:8-Bit ohne Vorzeichenint16_t
:signiertes 16-Bituint16_t
:unsigned 16-bitint32_t
:signiertes 32-Bituint32_t
:unsigned 32-bitint64_t
:signiertes 64-Bituint64_t
:unsigned 64-bit
Der stdint.h
Header ist in Abschnitt 7.20 des Standards beschrieben, mit genauen Breitentypen in Abschnitt 7.20.1.1. Der Standard besagt, dass diese Typedefs optional sind, aber sie existieren in den meisten Implementierungen.
Nein, weder der C-Standard noch POSIX garantieren dies und tatsächlich haben die meisten Unix-ähnlichen 64-Bit-Plattformen einen 64-Bit (8 Byte) long
.