Was ist int16_t

Hallo,

entschuldigung für diese einfache Frage aber ich finde keine gescheite Antwort.

Ich möchte eine Arduino-Bibliothek umschreiben, sodass ich sie in Atmel Studio benutzen kann.

Dabei gibt es eine Funktion die mit int16_t deklariert wurde.

Welchem Datentyp entspricht das in C?

Ich habe es mit signed int versucht, bekomme aber etwas falsches raus.

Danke und viele Grüße

Auf AVR ist das: int

byte= uint8_t, uint16_t wäre int und uint32_t wäre float, right?

und uint32_t wäre float, right?

auf AVR: unsigned long

Float und Double sind ganz andere Typen.
Nur zufälliger Weise die gleiche Bit Anzahl

Laut dem WIKI von Arduino ist double the same wie float.

Nur auf 8 Bit Prozessoren

Aber wie kommst du auf Gleitkommazahlen. Hier geht es um Integer

skorpi08:
Laut dem WIKI von Arduino ist double the same wie float.

Sach ich doch!

grfa1012:
Ich habe es mit signed int versucht, bekomme aber etwas falsches raus.

Sollte aber richtig sein. Ist ein 16-bitiger Ganzzahlwert mit Vorzeichen. uint16_t wäre unsigned. Auf dem ATMEGA ist das das gleiche wie int. Es gibt entsprechend auch (u)int(8/16/32/64)_t.

Ich habe mir die _t-Werte als Standard angewöhnt. Damit hat es auf einem 8bit AVR die selbe Länge wie auf einem 32bit ESP32. Gerade im embedded-Bereich überlege ich mir gut, wie groß meine Variable sein muss.

Float und Double legen ihre Daten völlig anders ab als Integer.

Integer sind binär zählend, deren höchstes Bit als Vorzeichen definiert ist.

Unsigned lassen das Vorzeichen weg, zählen also nur positiv bzw den Betrag

Float legen aber die Zahl als solche mit einer bestimmten Anzahl Kommastellen ab und dann einen Exponenten. Nur so kommt man über 2^32 raus was ja gerade mal 4 Milliarden ist. Will ich also mein einkommen ausrechnen muss ich Float nehmen. Allerdings kann man ja nicht mehr Stellen unterbringen als in Integer, folglich werden die Kleinbeträge einfach ausgeblendet. Weil es unwichtig ist ob ich 50,0000001 Milliarden oder 50,0000002 Milliarden habe. Float legt es als 0,50000000 x10^11 ab.

Float ist dabei eigentlich einfache Genauigkeit. Double, wie der Name sagt doppelte Genauigkeit und damit 64Bit groß. Nur mit speziellen Routinen kann man die Formate umwandeln. Während man ein 16Bit Integer einfach in ein 32 Bit integer wandeln kann. Einfach vorne Nullen dran hängen. Man kann mit Interger keine Kommazahlen erzeugen. Führt zjm anfängerfehler: int/int=meistens falsch. Den A/B*B müsste ja IMMER A ergeben.

10 / 3 = 3
3 * 3 = 9

Den es gibt keine Kommastellen, wenn man Integer teilt.

Wenn man wie oben gefragt nur die Sprache wechseln will, darf man auf typen gehen die größer sind. Also ein Float beim Arduino darf ich auch zum Double bei C machen. Ebenso darf ich ein16Bit Int zum 32Bit in C machen. Oder ein Unsigend Int 32 zu doubleword. (Word ist normalerweise unsigned Int)

Hier hat jede Sprach ein bischen Abweichungen, aber Int und Float darf man nie mischen.

Manchmal rechnet man in Int und trickst mit den fehlenden Kommastellen rum. Dann wird das Umstellen auf Float in die Hose gehen. Tricksen ist immer etwas fehleranfällig, aber leider bei so kleinem Speicher wie Arduino manchmal nötig.

Hallihallo!

Da ich denke, dass die bislang angefallenen Postings den TO eher verwirren als für Klarheit zu sorgen, gebe auch ich noch meinen Senf dazu:

Die ursprünglich in C definierten ganzzahligen Variablentypen heißen char, short, int und long. Als ob das nicht schon genug wäre, ist ein int auf einem Arduino etwas Anderes als ein int auf einem Standard-PC.

Damit man sich die jeweilige „Breite“ eines solchen Typs nicht merken muss, kann man beispielsweise statt char oder byte auch uint8_t schreiben, was einen vorzeichenlosen (u) ganzzahligen (int) 8-Bit-Wert bezeichnet (das _t steht für „Typ“).

Da die Arduino-Umgebung diese Typen bereits kennt, kann man sie sorglos verwenden, ohne dazu eine Bibliothek einbinden zu müssen. Auf 08/15-PCs ist hierfür ein

#include <stdint.h>

nötig.

Ich hoffe, das war verständlich :slight_smile:

Gruß

Gregor

PS: Ein int16_t ist demnach ein vorzeichenbehafteter ganzzahliger Typ mit einer Breite von 16 Bit. Wertebereich von -32768 bis 32767

chefin:
Will ich also mein einkommen ausrechnen muss ich Float nehmen.

Wegen der Rundungsfehler lässt du das besser (und es macht auch niemand).
Rechne in Cent oder von mir aus in 1/10 Cent und mit ganzen Zahlen (Fixkomma).

chefin:
Float legt es als 0,50000000 x10^11 ab.

Nein, so funktionieren Floats nicht, sie haben einen binären Exponent, da kommt kein 10^ vor.