Seite 1 von 3

short, int und long

Verfasst: Di Feb 05, 2013 12:34 pm
von Glocke
Hi,

ich habe hier: http://www2.informatik.uni-halle.de/lehre/c/c622.html gelesen, dass die Länge von int nicht eindeutig ist. Short verwendet 16 Bit, Long 32 und Int auf manchen Systemen 16 Bit, auf anderen 32 Bit. Stimmt das? :shock:

Bei mir scheint es 32 Bit zu verwenden. Die sizeof-Funktion liefert mir für Short 2 (klar, 2 * 8 Bit = 16 Bit), für Long 4 (auch klar, weil 4 * 8 Bit = 32 Bit) und für Int ebenfalls 4. Jedoch habe ich keinen Vergleich zu einem anderen System. Wenn sich das wirklich unterscheidet, sollte ich da (ich möchte plattformunabhängig programmieren) auf Int verzichten und explizit Short oder Long nehmen? :geek:

LG Glocke

Re: short, int und long

Verfasst: Di Feb 05, 2013 1:25 pm
von Xin
Glocke hat geschrieben:Hi,

ich habe hier: http://www2.informatik.uni-halle.de/lehre/c/c622.html gelesen, dass die Länge von int nicht eindeutig ist. Short verwendet 16 Bit, Long 32 und Int auf manchen Systemen 16 Bit, auf anderen 32 Bit. Stimmt das? :shock:
char verwendet mindestens 8 Bit, short int verwendet mindestens 16 Bit, int verwendet mindestens 16 Bit, heutzutage aber meistens 32, long int verwendet mindestens 32 Bit.
Ansonsten gibt es noch die Regel, dass char <= short int <= int <= long int ist.
char kann also auch genauso breit wie long int sein.

Es gibt aber auch Systeme auf denen char 9 oder 63 Bit breit ist.
Das wären heutzutage aber große Ausnahmen.
Glocke hat geschrieben:Bei mir scheint es 32 Bit zu verwenden. Die sizeof-Funktion liefert mir für Short 2 (klar, 2 * 8 Bit = 16 Bit), für Long 4 (auch klar, weil 4 * 8 Bit = 32 Bit) und für Int ebenfalls 4. Jedoch habe ich keinen Vergleich zu einem anderen System. Wenn sich das wirklich unterscheidet, sollte ich da (ich möchte plattformunabhängig programmieren) auf Int verzichten und explizit Short oder Long nehmen? :geek:
Du solltest möglichst so programmieren, dass es in die Mindestgrößen passt und Du nicht auf Überläufe angewiesen bist (die bei breiteren Datentypen ja nicht stattfinden würden...).

Realistisch gesehen kannst Du aber durchaus davon ausgehen, dass die bekannten Größen gelten. Du solltest aber davon ausgehen, dass (long int) irgendwann mal 64 Bit breit sein könnte, damit man nicht immer (long long int) schreiben muss... bzw. man konfiguriert den Compiler entsprechend. In C gibt es daher bereits Datentypen, die sich auf eine Breite festlegen.

Mit limits.h kannst Du Deine Software absichern, so dass sie auf unbekannten Systemen warnt oder komplett den Dienst verweigert.

Re: short, int und long

Verfasst: Di Feb 05, 2013 2:05 pm
von cloidnerux
Hier haben wir das mal getestet: http://www.proggen.org/forum/viewtopic. ... int#p14529

Gibt glaube ich noch 2 oder 3 Threads mit dem Thema.

Re: short, int und long

Verfasst: Di Feb 05, 2013 3:40 pm
von Glocke
Xin hat geschrieben:Du solltest möglichst so programmieren, dass es in die Mindestgrößen passt und Du nicht auf Überläufe angewiesen bist (die bei breiteren Datentypen ja nicht stattfinden würden...).
Xin hat geschrieben:Mit limits.h kannst Du Deine Software absichern, so dass sie auf unbekannten Systemen warnt oder komplett den Dienst verweigert.
Okay, das klingt machbar :)
Xin hat geschrieben:Realistisch gesehen kannst Du aber durchaus davon ausgehen, dass die bekannten Größen gelten.
Da bin ich beruhigt :) Trotzdem habe ich bei der Int16- und Int32-Sache noch Bauchschmerzen. Ist es da sinnvoll explizit short oder long zu verwenden? Ich habe irgendwie davor "Angst" in eine Int-Variable einen Wert reinzuschreiben, der in die 32-Bit Variante passt und auf einem System das 16-Bit Int hat dann aber nicht mehr passt. :?

Oder mache ich mir zu viele Sorgen? :mrgreen:

LG Glocke

Re: short, int und long

Verfasst: Di Feb 05, 2013 3:56 pm
von fat-lobyte
Glocke hat geschrieben:Da bin ich beruhigt :) Trotzdem habe ich bei der Int16- und Int32-Sache noch Bauchschmerzen. Ist es da sinnvoll explizit short oder long zu verwenden?
Ich sehe das so: wenn du ein Programm schreibst, dann hast du eine ungefähre vorstellung auf welchen Systemen es laufen wird. Überleg dir den Bereich an gültigen werten, und setze dementsprechend die variablen auf "short", nix, "long" oder "long long".
Ich finde, es bringt nichts (vor allem in der ersten Entwicklungsphase) ein Programm auf alle möglichen Systeme anzupassen.
Willst du das allerdings doch tun, kannst du aus <cstdint> std::int_least32_t, std::int_least64_t, ... verwenden.
Glocke hat geschrieben:Oder mache ich mir zu viele Sorgen? :mrgreen:
Jein. Einerseits "wird schon nichts passieren", andererseits hast du eben nicht die garantien, die beispielsweise ein Java-Programmierer hat. Damit müssen wir leben.

Re: short, int und long

Verfasst: Di Feb 05, 2013 4:03 pm
von Glocke
Okay, Danke :)

Re: short, int und long

Verfasst: Do Feb 07, 2013 12:19 pm
von Xin
Glocke hat geschrieben:Da bin ich beruhigt :) Trotzdem habe ich bei der Int16- und Int32-Sache noch Bauchschmerzen. Ist es da sinnvoll explizit short oder long zu verwenden? Ich habe irgendwie davor "Angst" in eine Int-Variable einen Wert reinzuschreiben, der in die 32-Bit Variante passt und auf einem System das 16-Bit Int hat dann aber nicht mehr passt. :?

Oder mache ich mir zu viele Sorgen? :mrgreen:
Du kannst auf eigene Datentypen ausweichen.

Code: Alles auswählen

typedef long int int32;
typedef short int16;

int main void()
{
  int32 a, b;
  a = 4;
  b = 5;
...
Packst Du die typedefs in eigene Header, brauchst Du nur eine Stelle zu ändern, wenn sich das System in 20 Jahren soweit geändert hat.
Ich persönlich verzichte darauf aus diese Grund. Ich verwende inzwischen eigene Primitiv-Klassen, zum Beispiel XSD::Primitive::Double statt double, da sie Funktionalität wie "AsString()" oder "Parse( char const *) zur Verfügung stellen, die sich wunderbar mit anderen meiner Templates kombinieren lassen und z.B. operator == so überladen ist, dass innerhalb einer gewissen Toleranz verglichen wird. Ähnliches für XSD::Primitives::Int - aber halt ohne Toleranz, was den Vergleich angeht. ;)

Sollte sich der Interne Typ (also int bzw. double) mal semantisch ändern, muss ich ihn halt gegen den Typ tauschen, der dann passt. Dafür gibt's ja Templates. :-)
fat-lobyte hat geschrieben:Jein. Einerseits "wird schon nichts passieren", andererseits hast du eben nicht die garantien, die beispielsweise ein Java-Programmierer hat. Damit müssen wir leben.
Wenn man es nicht ganz verhunzt, kannst Du mindestens(!) die gleichen Garantien geben.

Re: short, int und long

Verfasst: Do Feb 07, 2013 12:40 pm
von Glocke
Xin hat geschrieben:Du kannst auf eigene Datentypen ausweichen.

Code: Alles auswählen

typedef long int int32;
typedef short int16;

int main void()
{
  int32 a, b;
  a = 4;
  b = 5;
...
Ich glaube das ist genau das, was SDL mit Uint16 und dergleichen macht :)

Re: short, int und long

Verfasst: Do Feb 07, 2013 1:12 pm
von Xin
Glocke hat geschrieben:Ich glaube das ist genau das, was SDL mit Uint16 und dergleichen macht :)
Berechtigt - immerhin hat die SDL ja auch die Aufgabe auf mehr als nur einem System zu laufen, hier ist die Chance auf unterschiedliche Datentypgrößen zu treffen entsprechend höher.

Re: short, int und long

Verfasst: Do Feb 07, 2013 1:32 pm
von Glocke
Xin hat geschrieben:
Glocke hat geschrieben:Ich glaube das ist genau das, was SDL mit Uint16 und dergleichen macht :)
Berechtigt - immerhin hat die SDL ja auch die Aufgabe auf mehr als nur einem System zu laufen, hier ist die Chance auf unterschiedliche Datentypgrößen zu treffen entsprechend höher.
Also wäre es naheliegend (da ich auf Basis von SDL arbeiten möchte), direkt die von SDL verwendeten Primitiv-Datentypen zu verwenden, oder? 8-)