Wie hängen variable Größen mit der Prozessorarchitektur zusammen?

Ich komme oft in die Situation, dass ich mir nicht sicher bin, wie groß meine Variable ist, zB: Integer, Short, Long?

Ich weiß, dass ich die Größe der Variablen mit sizeof() finden kann; Funktion in C.

Aber jetzt bin ich in einer Situation, in der ich versuche, einige Daten aus einer Datei zu analysieren, und ich habe diese Dateistruktur. Wenn ich merke, dass alles für einen 8-Bit-Mikrocontroller geschrieben ist, bin ich mir nicht sicher, wie ich wissen kann, wie viele Daten INT in dieser Dokumentation darstellt? Ist es 8-Bit-1B? Wie groß die Variablen sind, hängt von der Prozessorarchitektur ab? Wenn ich richtig liege, beträgt die maximale Variablengröße in einem 8-Bit-Prozessor 1 B, also haben char - int und alle anderen Variablen eine maximale Größe von 1 B?

Kurze Antwort: Sie sind es nicht.
Noch ein weiterer guter Grund für die Verwendung von stdint.h .
@RogerRowland Sadly stdint.hwurde mit C99 eingeführt und viele der darin definierten Typen sind optional, dh eine Implementierung kann auch darauf verzichten. Für maximale Portabilität, insbesondere wenn kein großartiger C-Compiler verfügbar ist, müssen Sie also einige Vorverarbeitungstricks anwenden, um Ihren eigenen int-Typ als Typedef für einen vordefinierten Typ mit der richtigen Bitbreite zu definieren. Siehe außerdem die Kritik in demselben Artikel, auf den Sie verlinkt haben.
@RogerRowland Siehe insbesondere Abschnitt 7.18.1.1 Ganzzahltypen mit exakter Breite des C99-Standardentwurfs N1256 (Absatz 3): These types are optional. However, if an implementation provides integer types with widths of 8, 16, 32, or 64 bits, no padding bits, and (for the signed types) that have a two’s complement representation, it shall define the corresponding typedef names.Ich stimme zu, dass diese Bedingungen auf den meisten PCs erfüllt sind, aber ich kenne nicht alle MCUs, insbesondere die Bedingungen darüber Polsterung. YMMV
@LorenzoDonati Ja, einverstanden. Nicht perfekt, aber besser als nichts und zumindest ein Versuch, sich in eine bessere Richtung zu bewegen ...
@RogerRowland Ja! Definitiv!
Nur um das klarzustellen: 1. Die Datendatei, die Sie analysieren möchten, existiert bereits? 2. Sie haben eine Spezifikation der Dateistruktur, definiert mit C, oder C-Datentypen? Wenn eines davon nicht zutrifft, dann klären Sie es bitte. 3. Die Datei enthält binäre und keinen Text (dh sie sieht nicht korrekt aus, wenn Sie die Datei mit einem Texteditor betrachten)? Wenn das nicht stimmt, hast du ein anderes Problem. Wissen Sie, welcher Compiler und welche Compiler-Flags (vielleicht in einem Make-Fie?) verwendet wurden, um die Datei zu erstellen? Das zu wissen, kann ausreichen, um die Daten aus einer Binärdatei korrekt zu analysieren.

Antworten (2)

Auch wenn Ihr 8-Bit-Prozessor nur die Datenverarbeitung mit 8 Bit unterstützt, wird der Compiler alle notwendigen Dinge für eine 16-Bit-Addition und -Weitergabe von Daten erledigen, sodass die Größe in Bits von int, short oder anderen rein von Ihnen abhängt Compiler-Einstellungen.

Normalerweise finden Sie diese Informationen irgendwo im Compiler-Handbuch.

Um dieses Problem zu umgehen, empfiehlt es sich, die vom Compiler definierten Typen nicht direkt zu verwenden. Möglicherweise möchten Sie stdint.h (falls verfügbar) einschließen, das klar benannte Datentypen wie uint8_t bereitstellt, bei dem es sich um eine vorzeichenlose Ganzzahl mit 8 Bit handelt.

Wenn Sie dies nicht verwenden können, erstellen Sie Ihre eigene Version davon und erstellen Sie einen Header mit etwas in dieser Richtung (oder erhalten Sie eine vollständige stdint.h und passen Sie sie an Ihren Compiler an):

typedef unsigned char uint8_t

wo Sie natürlich in Ihrem Compiler-Handbuch nachsehen müssen, um die richtigen Compiler-Typen zu erhalten.

Dieses Wikibook gibt eine nette Erklärung von stdint.h.

Es gibt jedoch einige Probleme, da insbesondere für eingebettete Geräte nicht alle Datentypen von allen Compilern unterstützt werden. 64-Bit-Datentypen fehlen oft, daher gibt es zwei mögliche Ergebnisse: Entweder wird Ihr Programm nicht mehr kompiliert (ich denke, das ist der gute Fall) oder jemand hat den 64-Bit-Datentyp typedefin einen kleineren und Ihr Programm geändert könnte deshalb unerwartete Ergebnisse liefern.

Meiner Meinung nach sollte ein nicht unterstützter Datentyp zu einem Kompilierungsfehler führen, sodass sich der Programmierer des Problems tatsächlich bewusst ist, bevor er es im System trifft.

Als Beispiel, wo Sie diese Informationen für einen Compiler finden können:

Die IAR Embedded Workbench wird mit einer Reihe von Dokumentationen geliefert, für diese Art von Informationen müssen Sie im Entwicklungshandbuch nachsehen, und dort finden Sie unter den Referenzinformationen die Datendarstellung. Unter diesem Punkt finden Sie alle notwendigen Details zum korrekten Umgang mit Daten. Dort sind Ausrichtung, Größe und Reichweite angegeben.

Data type              Size      Range             Alignment
bool                   8 bits    0 to 1            1
char                   8 bits    0 to 255          1
...
signed long long       64 bits  -2^63 to 2^63-1    8
unsigned long long     64 bits   0 to 2^64-1       8

Sie müssen sich die Dokumentation Ihres C-Compilers ansehen. Es sollte die Antworten enthalten, die Sie benötigen.

Bei einem 8-Bit-Compiler kann "int" 8-Bit, 16-Bit oder etwas anderes sein. In einigen Fällen kann die Anzahl der Bits in einem standardmäßigen "int" über einen Befehlszeilenschalter oder eine Umgebungsvariable des Compilers ausgewählt werden.

Wenn der Compiler versuchen würde, sich an den C-Standard zu halten, würde er Ints nicht zu 8 Bit machen. Der C-Standard erfordert, dass ein int-Typ mindestens 16 Bit lang ist.
Ein AC-Compiler mit einem 8-Bit-Int ist ernsthaft kaputt. Der C89-Standard sagt nicht die Mindestanzahl von Bits oder die Darstellung explizit IIRC, sondern gibt einen Bereich an, der mindestens 16 Bits erfordert.