Autor Thema: C: Unterschied zwischen Standart Typen und ergänzende Typen  (Gelesen 7011 mal)

hrungaaz

  • Beiträge: 33
    • Profil anzeigen
Gespeichert
Servus,

eine Frage die mich schon ewig quält ist: Was bringen eigentlich die ergänzenden Typen (uint8_t, int8_t, ...) in C?
Ich mein, statt uint8_t kann man genauso unsigned char schreiben.
In der stdint.h ist das ja sowieso genau so definiert: typedef unsigned char uint8_t;

Gibt es da irgendwelche, mir nicht bekannte, Vorteile?
Der einzige "Vorteil", den ich darin sehe ist, dass uint8_t kürzer ist als unsigned char. Aber das wars auch schon.

Sorry wenn ich so eien banale Frage stelle, aber das musste einfach mal raus  :-)

mfg rungaaz

kevin

  • Administrator
  • Beiträge: 2 767
    • Profil anzeigen
Gespeichert
« Antwort #1 am: 27. September 2010, 11:42 »
unsigned char ist auf i386 dasselbe wie uint8_t. Okay, an dieser Stelle macht es wohl nur in der Theorie einen Unterschied, weil das auf jeder interessanten Plattform gleich sein dürfte. Aber Typen wie long unterscheiden sich auch in der Praxis auf unterschiedlichen Plattformen (Linux i386: 32 Bit; Linux x86_64: 64 Bit; Windows: grundsätzlich 32 Bit), während uintX_t überall eine definierte Breite hat. Es geht also um Portabilität.
Thou shalt not follow the NULL pointer, for chaos and madness await thee at its end.

erik.vikinger

  • Beiträge: 1 277
    • Profil anzeigen
Gespeichert
« Antwort #2 am: 27. September 2010, 11:51 »
Hallo,


Du kannst dich bei [ u]intXY_t darauf verlassen das er immer genau die angegebene Größe hat, nicht mehr und auch nicht weniger. Gerade wenn Dein Programm auch auf kleinen Mikrocontrollern (bei denen int oft nur 16 Bit hat) laufen soll oder Dir Portabilität sonstwie wichtig ist solltest Du diese Datentypen benutzen.

Wenn Du einfach nur nen int mit einer gewissen Mindestgröße benötigst, z.B. als Schleifenzähler für eine bestimmte Anzahl an Durchläufen, gibt es noch die leastXY-Typen mit denen Du sagst das du einfach einen Integer mit einem Mindest-Wertebereich haben willst es Dir aber egal ist wie groß der wirklich ist so lange die CPU damit so schnell als möglich umgehen kann. Viele 32Bit/64Bit-CPUs haben Probleme damit 16Bit-Integer zu benutzen (auch x86) so das es dort oft besser ist einen 32Bit/64Bit-Integer zu benutzen aber man will das nicht im Quell-Code so festlegen weil dann eventuell eine 16Bit-CPU diesen Code nur recht langsam ausführen kann.

Wimre sind diese Typen auch im aktuellen oder nächsten C-Standard Pflicht so das sie sehr portabel sind.


Grüße
Erik
Reality is that which, when you stop believing in it, doesn't go away.

hrungaaz

  • Beiträge: 33
    • Profil anzeigen
Gespeichert
« Antwort #3 am: 27. September 2010, 12:08 »
Erstmal Danke für die Antworten.
Macht Sinn, aber int64_t ist z.B. als long long definiert.
Und da long ja nicht auf jeder Plattform gleich groß ist, würde das ja bedeuten, dass es hier auch wieder Differenzen geben würde. Oder hat das etwas damit zu tun, dass long doppelt vorkommt?

Wenn ich jedoch unter Windows zwei Variablen definiere - eine als long int und die andere als long long int - und jeweils deren größe mit sizeof() ausgebe, dann ist die long int-Variable 4 Byte (32Bit) groß und die long long int-Variable 8 Byte (64Bit) groß. Soweit, so gut.
Wenn ich das jetzt aber auf einem 64Bit-Linux machen würde, auf dem - wie du gesagt hast, ein long 64Bit groß ist - dann wäre doch die long long int-Variable 16Byte und somit 128Bit groß - oder?
Oder wird das dann durch die ganzen Defines, welche noch in der stdint.h vorhanden sind geregelt?

erik.vikinger

  • Beiträge: 1 277
    • Profil anzeigen
Gespeichert
« Antwort #4 am: 27. September 2010, 12:36 »
Hallo,


"long long" ist ein Type und nicht die Verkettung von zwei Typen.
Das einzigste worauf Du Dich nach C-Spec verlassen kannst ist das long long nicht kleiner ist als long.

Laut C-Spec ist "long long" ist das selbe wie "long long int" und "unsigned long long" ist das selbe wie "unsigned long long int".


Macht Sinn, aber int64_t ist z.B. als long long definiert.
Nur dort wo long long auch tatsächlich 64 Bit groß ist, es wäre durchaus möglich das es Plattformen gibt auf dehnen long long nicht 64 Bit hat.


Grüße
Erik
Reality is that which, when you stop believing in it, doesn't go away.

hrungaaz

  • Beiträge: 33
    • Profil anzeigen
Gespeichert
« Antwort #5 am: 27. September 2010, 13:11 »
Ok, Danke, damit wäre das geklärt.

 

Einloggen