GNU/Linux >> LINUX-Kenntnisse >  >> Linux

Kann ich davon ausgehen, dass die Größe von long int immer 4 Bytes beträgt?

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-Bit
  • uint8_t :8-Bit ohne Vorzeichen
  • int16_t :signiertes 16-Bit
  • uint16_t :unsigned 16-bit
  • int32_t :signiertes 32-Bit
  • uint32_t :unsigned 32-bit
  • int64_t :signiertes 64-Bit
  • uint64_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 .


Linux
  1. OpenStack-Fehler – Indexspaltengröße zu groß. Die maximale Spaltengröße beträgt 767 Bytes [Gelöst]

  2. Ermitteln der Sektorgröße einer Partition?

  3. Wie kann ich die Größe von Dateien und Verzeichnissen in Linux sehen?

  4. Wie kann ich *nur* die Anzahl der auf einer Festplatte verfügbaren Bytes in Bash abrufen?

  5. Warum kann ich im Terminal nicht scrollen?

So erhalten Sie die Größe eines Verzeichnisses in Linux

So ermitteln Sie die Gesamtgröße eines Verzeichnisses in Linux

Kann ich die Größe eines dateibasierten Disk-Images erweitern?

Wie kann ich die aktuelle Größe des ARC in ZFS ermitteln und in welcher Beziehung steht der ARC zu freiem oder Cache-Speicher?

Kann ich die SID einer Oracle-Datenbank ändern?

Wie kann ich die Ausgabe von du -h nach Größe sortieren?