 |
C++Talk.NET C++ language newsgroups
|
| View previous topic :: View next topic |
| Author |
Message |
Ernst Baumann Guest
|
Posted: Sun Oct 10, 2004 12:29 pm Post subject: einfache Frage zu Datentyp-Umwandlung |
|
|
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
|
Posted: Sun Oct 10, 2004 9:18 pm Post subject: Re: einfache Frage zu Datentyp-Umwandlung |
|
|
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
|
Posted: Mon Oct 11, 2004 1:10 am Post subject: Re: einfache Frage zu Datentyp-Umwandlung |
|
|
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
|
Posted: Thu Oct 14, 2004 4:12 pm Post subject: Re: einfache Frage zu Datentyp-Umwandlung |
|
|
| 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
|
Posted: Thu Oct 14, 2004 7:58 pm Post subject: Re: einfache Frage zu Datentyp-Umwandlung |
|
|
"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
|
Posted: Thu Oct 14, 2004 8:03 pm Post subject: Re: einfache Frage zu Datentyp-Umwandlung |
|
|
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
|
Posted: Fri Oct 15, 2004 11:56 am Post subject: Re: einfache Frage zu Datentyp-Umwandlung |
|
|
| 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
|
Posted: Fri Oct 15, 2004 12:55 pm Post subject: Re: einfache Frage zu Datentyp-Umwandlung |
|
|
"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
|
Posted: Fri Oct 15, 2004 7:00 pm Post subject: Re: einfache Frage zu Datentyp-Umwandlung |
|
|
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 |
|
 |
|
|
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
|
|