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:

r

int ≠ int

Unterschiedliche Plattformen erlauben das Speichern unterschiedlich langer Werte.

void setup() { // put your setup code here, to run once: } void loop() { // put your main code here, to run repeatedly: Serial.println(sizeof(int)); // size in bytes #include Serial.println(INT_MAX); // max value an int can hold }

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.

void setup() { // put your setup code here, to run once: } void loop() { // put your main code here, to run repeatedly: Serial.println(sizeof(int32_t)); // size in bytes #include Serial.println(INT32_MAX); // max value an int32_t can hold }

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