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?
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 typedef
in 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.
Ignacio Vazquez-Abrams
Roger Rowland
Lorenzo Donati unterstützt die Ukraine
stdint.h
wurde 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.Lorenzo Donati unterstützt die Ukraine
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. YMMVRoger Rowland
Lorenzo Donati unterstützt die Ukraine
gbulmer