C++Talk.NET Forum Index C++Talk.NET
C++ language newsgroups
 
Archives   FAQFAQ   SearchSearch   MemberlistMemberlist   UsergroupsUsergroups   RegisterRegister 
 ProfileProfile   Log in to check your private messagesLog in to check your private messages   Log inLog in 

einfache Frage zu Datentyp-Umwandlung

 
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German)
View previous topic :: View next topic  
Author Message
Ernst Baumann
Guest





PostPosted: Sun Oct 10, 2004 12:29 pm    Post subject: einfache Frage zu Datentyp-Umwandlung Reply with quote



Hallo,
in einem Buch habe ich gelesen, daß wenn in einem Ausdruck (wie z.B.
intx + longy) verschiedene Datentypen vorkommen, der "kleinere"
Datentyp in den "größerern" umgewandelt wird, wobei "kleiner" bzw.
"größer" sich auf die fogende Reihenfolge bezieht:
int, unsigned int, long, unsigned long, float, double, long double

Frage:
wurden die folgenden Datentypen
char, signed char, unsigned char, short, unsigned short
in dieser obigen Reihenfolge vergessen (bzw. ist dies undefiniert und
dem jweiligen Compiler überlassen), bzw. wie sind diese dort
anzuordnen ?

mfg
Ernst

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de
Back to top
Stefan Reuther
Guest





PostPosted: Sun Oct 10, 2004 9:18 pm    Post subject: Re: einfache Frage zu Datentyp-Umwandlung Reply with quote



Ernst Baumann wrote:
Quote:
wurden die folgenden Datentypen
char, signed char, unsigned char, short, unsigned short
in dieser obigen Reihenfolge vergessen (bzw. ist dies undefiniert und
dem jweiligen Compiler überlassen), bzw. wie sind diese dort
anzuordnen ?

Diese werden zuerst nach 'int' konvertiert. Die Regel, die du zitiert
hast, bezieht sich auf Typen größer 'int'.

Stichworte 'Integral promotions' (Typ kleiner als int nach int), 'usual
arithmetic conversions' (gemeinsamen Typ von mehreren Werten >= int)


Stefan

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Horst Kraemer
Guest





PostPosted: Mon Oct 11, 2004 1:10 am    Post subject: Re: einfache Frage zu Datentyp-Umwandlung Reply with quote



Ernst Baumann <carlox (AT) web (DOT) de> wrote:

Quote:
Hallo,
in einem Buch habe ich gelesen, daß wenn in einem Ausdruck (wie z.B.
intx + longy) verschiedene Datentypen vorkommen, der "kleinere"
Datentyp in den "größerern" umgewandelt wird, wobei "kleiner" bzw.
"größer" sich auf die fogende Reihenfolge bezieht:
int, unsigned int, long, unsigned long, float, double, long double

Frage:
wurden die folgenden Datentypen
char, signed char, unsigned char, short, unsigned short
in dieser obigen Reihenfolge vergessen (bzw. ist dies undefiniert und
dem jweiligen Compiler überlassen), bzw. wie sind diese dort
anzuordnen ?

Bevor die oben zitierten Konvertierungen greifen, werden die Werte der
unten aufgefuehrten Typen nach folgender Regel "vorbehandelt".

Wenn der Wertebereich in den Wertebereich eines int hineinpasst,
werden sie in int konvertiert, anderfalls in unsigned int. In Systemen
mit 8-Bit-Chars kommt eine Konvertierung nach unsigned int i.d.R. nur
auf Systemen mit sizeof (short) == sizeof (int) == 2 (MS-DOS-Compiler
und aehnliche Altertuemer) bei einem Operanden vom Typ unsigned short
vor. Dieser wird dann formal nach unsigned int konvertiert. Zu
beachten ist, dass also bei 8-bit-chars auch ein unsigned char (und
bei 32-Bit-Systemen auch ein unsigned short) zunaechst in einen
(positiven) *signed* int konvertiert wird.

--
Horst

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Ernst Baumann
Guest





PostPosted: Thu Oct 14, 2004 4:12 pm    Post subject: Re: einfache Frage zu Datentyp-Umwandlung Reply with quote

Quote:
wurden die folgenden Datentypen
char, signed char, unsigned char, short, unsigned short
in dieser obigen Reihenfolge vergessen (bzw. ist dies undefiniert und
dem jweiligen Compiler überlassen), bzw. wie sind diese dort
anzuordnen ?

Diese werden zuerst nach 'int' konvertiert. Die Regel, die du zitiert
hast, bezieht sich auf Typen größer 'int'.

Das habe ich verstanden.

Was ist aber, wenn sich in einem Ausdruck mehrere Datentypen befinden,
die kleiner int sind, wie z.B: short * char ?
Welcher Datentyp hat dann dieser Ausdruck (z.B. short * char)?

Beispiel:

int main(){
short s;
char c;
char ergc='A';
short ergs;
s = 32000/65;
c = 'A';

ergs = s * c;
ergc = s * c;
return(0);
}

mfg
Ernst

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Thomas Mang
Guest





PostPosted: Thu Oct 14, 2004 7:58 pm    Post subject: Re: einfache Frage zu Datentyp-Umwandlung Reply with quote


"Ernst Baumann" <carlox (AT) web (DOT) de> schrieb im Newsbeitrag
news:6c9tm0hfihqd4kc7r3t18frc2bms3qupbe (AT) 4ax (DOT) com...
Quote:
wurden die folgenden Datentypen
char, signed char, unsigned char, short, unsigned short
in dieser obigen Reihenfolge vergessen (bzw. ist dies undefiniert und
dem jweiligen Compiler überlassen), bzw. wie sind diese dort
anzuordnen ?

Diese werden zuerst nach 'int' konvertiert. Die Regel, die du zitiert
hast, bezieht sich auf Typen größer 'int'.

Das habe ich verstanden.
Was ist aber, wenn sich in einem Ausdruck mehrere Datentypen befinden,
die kleiner int sind, wie z.B: short * char ?

5/9:
"Otherwise[wenn keine floating-point types vorliegen], the integral
promotions (4.5) shall be performed on both operands".

Dann kommen noch eine paar Spezialregeln für den Fall daß long / unsigned im
Spiel ist, was bei uns nicht der Fall ist.
Also wird der short -> int konvertiert, der char -> int konvertiert, die
Multiplikation mit 2 ints durchgeführt und das Resultat als int
zurückgegeben.



Quote:
Welcher Datentyp hat dann dieser Ausdruck (z.B. short * char)?

int

Quote:

Beispiel:

int main(){
short s;
char c;
char ergc='A';
short ergs;
s = 32000/65;

'32000' hat Typ int, '65' hat Typ int. Das Resultat ist ein int, daß in ein
short umgewandelt wird, wobei logischerweise nicht auf overflow überprüft
wird. Dafür hast Du selber zu sorgen.

Quote:
c = 'A';

ergs = s * c;

s (ein short) wird in ein int umgewandelt, c (ein char) wird in ein int
umgewandelt, die Multiplikation ergibt ein int das wiederum in ein char
umgewandelt wird. Wieder ist es Deine Aufgabe zu sorgen, daß ein char das
Resultat repräsentieren kann, z.b:

int result = s*c;

if (result > std::numeric_limits<char>::max())
throw std::overflow_error("result cannot be represented as char");
else
ergs = result;


Natürlich kann s*c einen overflow produzieren, was zu undefiniertem
Verhalten führt........


Quote:
ergc = s * c;
return(0);
}


Thomas

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Dirk Clemens
Guest





PostPosted: Thu Oct 14, 2004 8:03 pm    Post subject: Re: einfache Frage zu Datentyp-Umwandlung Reply with quote

Ernst Baumann wrote:

Quote:
Was ist aber, wenn sich in einem Ausdruck mehrere Datentypen befinden,
die kleiner int sind, wie z.B: short * char ?
Welcher Datentyp hat dann dieser Ausdruck (z.B. short * char)?

int, da bei Ausdrücken die Operanden ,kleinerer Typen' immer
in int, unsigned int bzw. double gewandelt werden.

Lemmi

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Ernst Baumann
Guest





PostPosted: Fri Oct 15, 2004 11:56 am    Post subject: Re: einfache Frage zu Datentyp-Umwandlung Reply with quote

Quote:
Welcher Datentyp hat dann dieser Ausdruck (z.B. short * char)?

int


Beispiel:

int main(){
short s;
char c;
char ergc='A';
short ergs;
s = 32000/65;

'32000' hat Typ int, '65' hat Typ int. Das Resultat ist ein int, daß in ein
short umgewandelt wird, wobei logischerweise nicht auf overflow überprüft
wird. Dafür hast Du selber zu sorgen.

Angenommen, f1 und f2 seien vom Datentyp float. Wenn ich die Anweisung

f2 = 6-0.05*f1;
mit MS VC++ 6.0 compiliere, dann bringt der Compiler die Warnung
"double --> float", was ich verstehe.

Warum bringt mir derselbe Compiler aber bei der Anweisung
s = 32000/65;
_nicht_ die Warnung "integer --> short" ????


Quote:

c = 'A';

ergs = s * c;


(***)
s (ein short) wird in ein int umgewandelt, c (ein char) wird in ein int
umgewandelt, die Multiplikation ergibt ein int das wiederum in ein char
umgewandelt wird.

Ich vermute, du beziehst dich mit dieser, gerade gemachten Aussage

(***) auf die Anweisung:
ergc = s * c;
Ist das korrekt?

mfg
Ernst

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Markus Schaaf
Guest





PostPosted: Fri Oct 15, 2004 12:55 pm    Post subject: Re: einfache Frage zu Datentyp-Umwandlung Reply with quote

"Ernst Baumann" <carlox (AT) web (DOT) de> schrieb:

Quote:
Warum bringt mir derselbe Compiler aber bei der Anweisung
s = 32000/65;
_nicht_ die Warnung "integer --> short" ????

Weil 492 (in dieser Umgebung) prima in einen »short« paßt.
Wäre ja auch lästig, wenn er bei solchen Anweisungen

char c = 23;
short s = 42;

jedesmal rumheulen würde. Das wäre sogar sehr schlecht, weil
es Leute dazu bringen würde, sowas zu schreiben

short s = (short) 42000000;

und auch keine Warnung zu bekommen.

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Horst Kraemer
Guest





PostPosted: Fri Oct 15, 2004 7:00 pm    Post subject: Re: einfache Frage zu Datentyp-Umwandlung Reply with quote

Ernst Baumann <carlox (AT) web (DOT) de> wrote:

Quote:
Welcher Datentyp hat dann dieser Ausdruck (z.B. short * char)?

int


Beispiel:

int main(){
short s;
char c;
char ergc='A';
short ergs;
s = 32000/65;

'32000' hat Typ int, '65' hat Typ int. Das Resultat ist ein int, daß in ein
short umgewandelt wird, wobei logischerweise nicht auf overflow überprüft
wird. Dafür hast Du selber zu sorgen.

Angenommen, f1 und f2 seien vom Datentyp float. Wenn ich die Anweisung
f2 = 6-0.05*f1;
mit MS VC++ 6.0 compiliere, dann bringt der Compiler die Warnung
"double --> float", was ich verstehe.

Warum bringt mir derselbe Compiler aber bei der Anweisung
s = 32000/65;
_nicht_ die Warnung "integer --> short" ????

Die Faelle sind grundverschieden. Im zweiten Fall sieht der Compiler
bereits das Ergebnis der Division 32000/65, und stellt fest, dass der
Wert in einen short hineinpasst.

Andererseits warnt er bei

float f = 1.2;

(bei der gleichen Warnstufe) obwohl er sogar sehen kann, dass 1.2 im
Wertebereich eines float liegt. Trotzdem gibt es hier einen
"Verkuerzungsverlust". Der Literal 1.2 wird zunaechst in den dem
mathematischen Wert 1.2 am naechsten kommenden double-Wert im
Bineaerformat konvertiert. Dieser wird nun nach float gerundet und
liefert wahrscheinlich den 1.2 am naechsten kommenden binaeren
float-Wert, der vom double-Wert (und auch vom mathematischen Wert 1.2)
abweicht. Hier ist der Grund der Warnung, dass double-Werte eine
feinere Rasterung als float-Werte besitzen, so dass es ein reiner
Zufall waere, wenn ein double-Wert tatsaechlich auf dem groeberen
float-Raster liegt, so dass ein double-Wert durch Speichern im
float-Format praktisch immer "verfaelscht" wird.

--
Horst

--
de.comp.lang.iso-c++ - Moderation: mailto:voyager+mod (AT) bud (DOT) prima.de
FAQ: http://www.voyager.prima.de/cpp/ mailto:voyager+send-faq (AT) bud (DOT) prima.de

Back to top
Display posts from previous:   
Post new topic   Reply to topic    C++Talk.NET Forum Index -> C++ (German) All times are GMT
Page 1 of 1

 
Jump to:  
You cannot post new topics in this forum
You cannot reply to topics in this forum
You cannot edit your posts in this forum
You cannot delete your posts in this forum
You cannot vote in polls in this forum


Powered by phpBB © 2001, 2006 phpBB Group
SEO toolkit © 2004-2006 webmedic.