Portable Datentypen – t-Types
Insbesondere bei der Programmierung von Micro-Controllern ist es sinnvoll, Variablendeklarationen so zu gestalten, dass man seinen Code einfach von einer Plattform zur nächsten portieren kann. Eine als int deklarierte Variable ist nämlich nicht auf allen Systemen gleich. Z.B. nimmt diese auf einem Arduino (ATMega) 16 byte Speicherplatz ein, auf einem ESP32 hingegen 32 byte.
D.h. auf einem ESP32 kann ich Werte von -2.147.483.648 bis 2.147.483.647 in einem int speichern, auf dem Arduino hingegen nur von -32.768 to 32.767. Habe ich also ein Programm auf dem ESP32 entwickelt, dass auch z.B. den Wert 32.769 in dieser int Variable speichert, wird dies auf einem Arduino zum Absturz führen.
Für verschiedene Variablentypen könnt Ihr dies mit diesem kleinen Programm ausprobieren:
int ≠ int
Unterschiedliche Plattformen erlauben das Speichern unterschiedlich langer Werte.
Das Programm ermittelt den maximalen Wert, den eine Int Variable aufnehmen kann. Wenn Ihr dieses Programm auf einem ATMega328 und anschließend auf einem ESP32 ausführt, werdet Ihr sehen, dass es unterschiedliche Ausgabewerte für MAX_INT gibt.
Wenn Ihr dieses Programm ausführt, wird es – egal auf welcher Plattform – immer dieselbe Ausgabe liefern. Das liegt daran, dass durch den Typ int32_t klar festgelegt ist, welchen Wertebereich (genauergesagt: wieviel Speicher) die Variable hat.
Die t-Typen sind auch unter dem Begriff „Portable Datentypen“ bekannt.
In der folgenden Tabelle findet Ihr eine Übersicht der verschiedenen portablen Datentypen für Int-Werte.
Die verschiedenen t-Typen.
Name | Bytes | Range |
int8_t | 1 | -128 .. 127 |
int16_t | 2 | -32768 .. 32767 |
int32_t | 4 | −2147483648 .. 2147483647 |
int64_t | 8 | −9223372036854775808 .. 9223372036854775807 |
uint8_t | 1 | 0 .. 255 |
uint16_t | 2 | 0 .. 65535 |
uint32_t | 4 | 0 .. 4294967295 |
uint64_t | 8 | 0 .. 18446744073709551615 |