Herzlich Willkommen, lieber Gast!
  Sie befinden sich hier:

  Forum » C / C++ (ANSI-Standard) » int oder long int oder __int32, wie ist es richtig?

Forum | Hilfe | Team | Links | Impressum | > Suche < | Mitglieder | Registrieren | Einloggen
  Quicklinks: MSDN-Online || STL || clib Reference Grundlagen || Literatur || E-Books || Zubehör || > F.A.Q. < || Downloads   

Autor Thread - Seiten: > 1 < [ 2 ]
000
13.09.2006, 01:03 Uhr
2cHH



Hi,

ich frage mich gerade, wann man wie eine Variable korrekt deklariert.

Ich habe nun schon in verschiedenen Tutorials oder Scripts gelesen, das Variablen korrekt auf eine ganz bestimmte Weise bezeichnet werden sollten, die sich aber immer etwas unterscheidet, weswegen ich hier mal nachfrage.


Ein char ist immer 8Bit, aber da hört es imho schon auf. signed und unsigned ist klar, mit ohne ohne vorzeichen (zweierkomplement). Was ist, wenn man einen grossen Zähler deklarieren möchte, schreibt man das als int32 oder einfach nur int oder besser long int?


Gruss aus Hamburg
--
greetz,
2cHH
_____________
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
001
13.09.2006, 01:57 Uhr
Blubber2063



Also, das kann man so allgemein schlecht sagen.

Erstmal ist char 1 Byte gross, wie gross das Byte ist hängt von der Plattform ab. Das gleiche gilt für Größen wie int, long, etc. Dafür gibt es eine gewisse Ordnungsrelation der Datentypen die vom C/C++ Standard vorgegeben wird. Ansonsten ist die Größe der Datentypen abhängig von der Plattform und des Compilers.

Beispiel 32 Bit Rechner mit GCC:

char 1 Byte
short 2 Byte
int 4 Byte
long 4 Byte
long long 8 Byte

Das mit dem int32 ist meines Wissens nicht teil des Standards, Windows bietet diese Datentypen an(evlt. auch Unix Systeme, will ich nicht beschreien), damit man die Größe des Typs kennt.

Solche typedefs werden auch sonst gerne manuell vorgenommen, wenn man auf mehr als einer Plattform arbeiten will um die Größe zu garantieren. Das typedef muss dann nur einmal auf die richtige Größe geändert werden und der typ ist überall wieder richtig gross.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
002
13.09.2006, 07:34 Uhr
virtual
Sexiest Bit alive
(Operator)


@Blubber

seit C99 gibt es den Header stdint.h, Da gibt es u.a. die Typen intX_t mit X in {8, 16, 32, 64 }
--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
003
13.09.2006, 10:09 Uhr
(un)wissender
Niveauwart


Für C++ gibt es das auch von boost.
--
Wer früher stirbt ist länger tot.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
004
13.09.2006, 11:04 Uhr
0xdeadbeef
Gott
(Operator)


Es kommt auf den Verwendungszweck an. Normalerweise, d.h. wenn du irgendwas berechnen willst oder so, empfiehlt es sich, mit Standardbasistypen zu arbeiten. Im Fall von Ganzzahlen bedeutet das meistens int, oder gelegentlich long, wenn du die Befürchtung hast, dass int auf manchen Plattformen nicht ausreicht. Allerdings ist long mehr oder weniger ein Relikt aus 16-bit-Zeiten, als viele Compiler int mit 16 bit und long mit 32 bit Länge belegten. Für Fließkommazahlen nimmt man meistens double, float ist häufig zu ungenau.

Wenn du allerdings genau eine bestimmte Länge brauchst - zum Beispiel, wenn du etwas übers Netzwerk übertragen willst und dein Gegenüber sich drauf verlässt, dass du ihm die Zahl in genau vier Byte schickst - dann macht es Sinn, die (u)int#_t-Typen zu benutzen, weil die eine bestimmte Breite garantieren.
--
Einfachheit ist Voraussetzung für Zuverlässigkeit.
-- Edsger Wybe Dijkstra
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
005
13.09.2006, 11:13 Uhr
Blubber2063



Hmmm, gut zu wissen Virtual, dachte man müsste das immer noch per Hand machen, praktische Sache.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
006
13.09.2006, 12:45 Uhr
2cHH



Hi,


OK, thnx.


Zitat von Blubber2063:
Erstmal ist char 1 Byte gross, wie gross das Byte ist hängt von der Plattform ab.


Daran hatte ich garnicht gedacht, ein Byte muss also nicht aus 8 bit bestehen?


Zitat von 0xdeadbeef:
Allerdings ist long mehr oder weniger ein Relikt aus 16-bit-Zeiten, als viele Compiler int mit 16 bit und long mit 32 bit Länge belegten. Für Fließkommazahlen nimmt man meistens double, float ist häufig zu ungenau.


Dann kann ich eigentlich davon ausgehen, dass heutzutage mein int-Zähler mindestens 4 Byte hat. Die Typenbezeichnungen mit Grössenangabe verwendet man also nur, wenn eine ganz bestimmte Grösse gefordert ist und normalerweise nicht, um eine grosse Zählvariable zu deklarieren.
Dann werde ich Zählvariablen weiterhin als signed int oder unsigned int deklarieren.


Wie ist das denn mit Float und Double, sind Floatberechungen eigentlich schneller?

Dass Floats weniger Speicherplatz brauchen als Doubles ist klar, aber wie ist das mit der Verarbeitungsgeschwindigkeit bei der ALU; bei den "ganzzahligen" Befehlen soll ja bei short nicht schneller sein als long, ist es bei Float und Double genauso?
--
greetz,
2cHH
_____________

Dieser Post wurde am 13.09.2006 um 12:46 Uhr von 2cHH editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
007
13.09.2006, 12:56 Uhr
Guybrush Threepwood
Gefürchteter Pirat
(Operator)



Zitat von 2cHH:

Daran hatte ich garnicht gedacht, ein Byte muss also nicht aus 8 bit bestehen?


Genau

Zitat von 2cHH:

Dann kann ich eigentlich davon ausgehen, dass heutzutage mein int-Zähler mindestens 4 Byte hat.

Nein. Das kommt wie gesagt auf deine Zielplattform drauf an und was für eine Anwendung du erstellst.

Auf einem ganz normalen 32 Bit PC ist int normalerweise auch 32 Bit groß. Benutzt du jetzt aber irgendeinen alten 16Bit Compiler und erstellst also eine 16 Bit Anwendung läuft diese ja auch auf deinem 32 Bit System. int wäre in dem Fall aber trotzdem nur 16 Bit breit.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
008
13.09.2006, 13:06 Uhr
virtual
Sexiest Bit alive
(Operator)



Zitat:
Erstmal ist char 1 Byte gross, wie gross das Byte ist hängt von der Plattform ab.

Daran hatte ich garnicht gedacht, ein Byte muss also nicht aus 8 bit bestehen?



Nicht zwingend. Es ist einfach so, daß ein char die kleinste Adressierbare Speichereinheit ist. (Von bits kann man bekanntlich keine Adresse ermitteln). Dabei kann ein ein char auch zB 16 Bit haben. Es sind auch esoterische Platformen mit 9 Bit pro Byte denkbar.


Zitat:

Dann kann ich eigentlich davon ausgehen, dass heutzutage mein int-Zähler mindestens 4 Byte hat. Die Typenbezeichnungen mit Grössenangabe verwendet man also nur, wenn eine ganz bestimmte Grösse gefordert ist und normalerweise nicht, um eine grosse Zählvariable zu deklarieren.
Dann werde ich Zählvariablen weiterhin als signed int oder unsigned int deklarieren.


Lediglich die Ungleichung

C++:
1 == sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long)


ist garantiert. Es ist eine oft geäußerte (und berechtigte) Grundkritik an C/C++, daß ausgerechnet eine Sprache, deren Standard auf Platformunabhängigkeit zielt, nicht in der Lage ist, verbindliche Größen für die Standardtypen zu definieren.


Zitat:

Wie ist das denn mit Float und Double, sind Floatberechungen eigentlich schneller?

Dass Floats weniger Speicherplatz brauchen als Doubles ist klar, aber wie ist das mit der Verarbeitungsgeschwindigkeit bei der ALU; bei den "ganzzahligen" Befehlen soll ja bei short nicht schneller sein als long, ist es bei Float und Double genauso?


Es ist nicht standardisiert, was schneller läuft. Allerdings - und das ist das Gegenargument zu der oben angesprochenen Grundkritik: speziell der Datentyp "int" ist in der Regel so gewählt, daß er hinsichtlich Ganzzahlberechnungen am effizientesten (In "Performance") ist. Mit anderen Worten: wenn Du die Wahl zwischen einem ganzzahl typen hast, solltest Du stets einen von int abgeleiteten Typen nutzen.


Bearbeitung:

quotes gefixt


--
Gruß, virtual
Quote of the Month
Ich eß' nur was ein Gesicht hat (Creme 21)

Dieser Post wurde am 13.09.2006 um 13:10 Uhr von virtual editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
009
13.09.2006, 13:24 Uhr
2cHH




Zitat von Guybrush Threepwood:
Benutzt du jetzt aber irgendeinen alten 16Bit Compiler und erstellst also eine 16 Bit Anwendung läuft diese ja auch auf deinem 32 Bit System. int wäre in dem Fall aber trotzdem nur 16 Bit breit.


OK, aber wenn ich bei gcc oder PellesC-Compiler bleibe, kann ich imho unbesorgt int nehmen, oder nicht?




Zitat von virtual:
Es sind auch esoterische Platformen mit 9 Bit pro Byte denkbar.


Hehe, esoterische Platformen mit 9 Bit.....




Zitat von virtual:
wenn Du die Wahl zwischen einem ganzzahl typen hast, solltest Du stets einen von int abgeleiteten Typen nutzen.


Ja, aber wenn ich zwischen Float und Double wählen kann?

Ich will sagen, es ist doch eine Überlegung bei Fliesskommazahlen immer Double zu nehmen, auch wenn die Zahl nur eine Vor- und Nachkommastelle hat. Ist Float auch noch ein Relikt aus 16bit-Zeiten oder gibt es auch bei modernen Rechnern Gründe, die dagegen sprechen würden, "kleine" Fliesskommazahlen nicht als Float, sondern generell als Double zu deklarieren?

Von grossen Arrays mal abgesehen, die ja bei Double mehr Platz brauchen.....
--
greetz,
2cHH
_____________

Dieser Post wurde am 13.09.2006 um 13:26 Uhr von 2cHH editiert.
 
Profil || Private Message || Suche Download || Zitatantwort || Editieren || Löschen || IP
Seiten: > 1 < [ 2 ]     [ C / C++ (ANSI-Standard) ]  


ThWBoard 2.73 FloSoft-Edition
© by Paul Baecher & Felix Gonschorek (www.thwboard.de)

Anpassungen des Forums
© by Flo-Soft (www.flo-soft.de)

Sie sind Besucher: