short, int und long

Schnelle objektorientierte, kompilierende Programmiersprache.
Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

short, int und long

Beitrag von Glocke » Di Feb 05, 2013 12:34 pm

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

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: short, int und long

Beitrag von Xin » Di Feb 05, 2013 1:25 pm

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.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Benutzeravatar
cloidnerux
Moderator
Beiträge: 3125
Registriert: Fr Sep 26, 2008 4:37 pm
Wohnort: Ram (Gibts wirklich)

Re: short, int und long

Beitrag von cloidnerux » Di Feb 05, 2013 2:05 pm

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.
Redundanz macht wiederholen unnötig.
quod erat expectandum

Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

Re: short, int und long

Beitrag von Glocke » Di Feb 05, 2013 3:40 pm

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

Benutzeravatar
fat-lobyte
Beiträge: 1398
Registriert: Sa Jul 05, 2008 12:23 pm
Wohnort: ::1
Kontaktdaten:

Re: short, int und long

Beitrag von fat-lobyte » Di Feb 05, 2013 3:56 pm

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.
Haters gonna hate, potatoes gonna potate.

Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

Re: short, int und long

Beitrag von Glocke » Di Feb 05, 2013 4:03 pm

Okay, Danke :)

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: short, int und long

Beitrag von Xin » Do Feb 07, 2013 12:19 pm

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.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

Re: short, int und long

Beitrag von Glocke » Do Feb 07, 2013 12:40 pm

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 :)

Benutzeravatar
Xin
nur zu Besuch hier
Beiträge: 8862
Registriert: Fr Jul 04, 2008 11:10 pm
Wohnort: /home/xin
Kontaktdaten:

Re: short, int und long

Beitrag von Xin » Do Feb 07, 2013 1:12 pm

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.
Merke: Wer Ordnung hellt ist nicht zwangsläufig eine Leuchte.

Ich beantworte keine generellen Programmierfragen per PN oder Mail. Dafür ist das Forum da.

Glocke
Beiträge: 332
Registriert: Fr Okt 26, 2012 8:39 am

Re: short, int und long

Beitrag von Glocke » Do Feb 07, 2013 1:32 pm

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-)

Antworten