Integer mit Werte Bereiche grösser als 32 Tausend?

Hallo!

Sagt das Handbuch nicht das Integer von -32000 bis +32000 geht?
Und doch konnte ich eine Schleife mit Integer=100000 programmieren!

Frage: Wird Integer vom Compiler in Double oder DWORD intern umgewandelt falls es grössere Zahlen braucht?

Ciao
Catmad

Hallo!

Sagt das Handbuch nicht das Integer von -32000 bis +32000
geht?
Und doch konnte ich eine Schleife mit Integer=100000
programmieren!

  1. Die ANSI Vorgaben geben nur das minimum an, mehr duerfen die
    Compilerbauer immer verheizen- dann braucht das Programm halt mehr Speicher.

  2. Woher weisst Du, dass Deine Schleife funktioniert hat ?

MFG
Martin

Hallo Martin!

  1. Woher weisst Du, dass Deine Schleife funktioniert hat ?

Ich habe die Werte auf dem Bildschirm ausgegeben!

Ciao
Catmad

Aktuelle Intel-Prozessoren arbeiten mit 32 bit Integers, also kannst du 2^32 = 4,2 Milliarden verschiedene Zahlen darstellen.

Bei signed integers also einen Wertebereich von ca.

-2*10^9 bis +2*10^9

MfG Bruno

Hi Catmad :smile:

Sagt das Handbuch nicht das Integer von -32000 bis +32000
geht?

Der ANSI-Standard schreibt vor, dass int mindestens 16 Bits hat und long int mindestens 32 Bits. Ein normales int kann daher mindestens die Werte von -32768 bis +32767 aufnehmen und ein long int mindestens die Werte von -231 bis +231-1.

Und doch konnte ich eine Schleife mit Integer=100000
programmieren!

Neben den oben genannten Minimalanforderungen empfiehlt der ANSI-Standard, dass int der Standard-Ganzzahl-Typ des Prozessors sein sollte. Da akutelle Intel/AMD-Prozessoren mit 32 Bits arbeiten, geht der Wertebereich eines int von -231 bis +231-1. Mit anderen Worten, auf aktuellen PCs sind long int und int identisch.

Frage: Wird Integer vom Compiler in Double oder DWORD intern
umgewandelt falls es grössere Zahlen braucht?

char , unsigned char und short werden immer in int umgewandelt. unsigned short wird in int umgewandelt, wenn int mehr Bits hat als short int , sonst wird in unsigned int umgewandelt.

Ansonsten gilt, dass vor bestimmten Verknüpfungen von 2 Operanden die beiden Datentypen angepasst werden. Der „kleinere“ Datentyp wird also an den „größeren“ Datentyp angeglichen. Das Ergebnis der Operation hat dann ebenfalls den „größeren“ Datentyp. Der Standard schreibt vor, dass diese Umwandlung verlustfrei passieren muss. Daher kann z.B. ein int (32 Bits) nicht in ein float umgewandelt werden, weil float nur 6 gültige Stellen hat. Auf PCs passiert die Umwandlung daher so:

int -> long -> double -> long double
unsigned int -> unsigend long -> double -> long double

Diese Regeln sind absichtlich sehr schwammig formuliert worden, um die Compilerbauer beim Entwickeln effizienter Compiler nicht zu sehr einzuschränken. Man muss also aufpassen, wie folgende Beispiele zeigen:

1/20 = int/int -> Ergebnis = int
1.0/20 = double/int -> double/double -> Ergebnis = double
1.0f/20 = float/int -> double/double -> Ergebnis = double

Am besten, man macht in Zweifelsfällen eine explizite Typ-Umwandlung, etwa (double)x.

cu Stefan.

Lass mal dieses programm laufen:

#include 

int main(int argc, char \*argv[])
{
 cout 

recht interessant um zu sehen, wie gross die einzelnen Datentypen auf deinem Systen sind. Auf Linux kommt bei manchen Sachen z.B. was anderes raus als unter Windows NT (beide Intel P3).

MfG Bruno

ach ja…
das DIng musste durch nen C++ Compiler laufen lassen oder du machst es mit printf’s statt den IO-Streams wie in meinem beispiel.

Bruno