Datentyp des Ergebnisses einer Operation

24/06/2012 - 02:07 von Sven Köhler | Report spam
Hallo,

meine Frage ist die folgende: mit welchen Datentyp gerechnet wird, wenn
die zwei Operanden einer Operation (+, -, /, *) unterschiedlich sind?
IMHO sollte man diese Regel kennen, nur leider gelingt es mir nicht eine
seriöse Quelle zu ergoogeln.

Ein Beispiel:
float x = 5 / 2 * 3.0f;

Bei meinen Google-Recherchen treten nur so komische Forumsbeitràge zu
tage, wo irgendwer meint es würde der ganze Ausdruck (rechts vom =)
gescannt und alle Operanden würden in den größten Datentyp konvertiert.
Das làsst sich leicht widerlegen, denn in obigen Beispiel kommt 6.0f heraus.

Es dràngt sich mir der Gedanke auf, dass es so ist wie ich es von Java
zu wissen glaube:
Es werden die zwei Operanden jeder einzelnen Operation genommen, und
beide Operanden werden in den größeren der beiden Datentypen konvertiert
und die Operation ausgeführt. D.h. in obigem Beispiel wird erst 5/2
betrachtet und als Integer-Devision ausgeführt (Ergebnis 2). Danach wird
das Ergebnis der Division in float konvertiert (2.0f) und eine
float-Multiplikation ausgeführt.

Kann das jemand bestàtigen bzw. mich berichtigen? Was passiert wenn ein
Operand uint32_t und der andere int32_t (also signed) ist? Der kleinste
Datentyp der beide umfasst wàre int64_t.


Grüße,
Sven
 

Lesen sie die antworten

#1 Thomas Koller
24/06/2012 - 10:53 | Warnen spam
In de.comp.lang.c Sven Köhler wrote:
meine Frage ist die folgende: mit welchen Datentyp gerechnet wird, wenn
die zwei Operanden einer Operation (+, -, /, *) unterschiedlich sind?
IMHO sollte man diese Regel kennen, nur leider gelingt es mir nicht eine
seriöse Quelle zu ergoogeln.



Nicht? Wobei _die_ seriöse Quelle ist der C-Standard. Das entscheidende
Stichwort ist "usual arithmetic conversions".

Im Prinzip làuft es so ab, wenn einer der Operanden long double ist
wird der andere in long double umgewandelt, sonst wenn einer double ist
in double, sonst wenn einer float ist, der andere in float und sonst
werden die integer promotions durchgeführt. Wenn dann beides signed oder
unsigned ist, wird in den Typ des höheren gewandelt, sonst wenn der
unsigned typ höheren oder gleichen Rang hat, wird in den unsigned Typ
gewandelt, wenn signed Typ höheren Rang hat und er alle Werte vom
unsigned Typ aufnehmen kann, wird in den signed Typ gewandelt, und
ansonsten wird in den unsigned Typ gewandelt der dem Typ vom signed
Argument entspricht.

Ein Beispiel:
float x = 5 / 2 * 3.0f;

Bei meinen Google-Recherchen treten nur so komische Forumsbeitràge zu
tage, wo irgendwer meint es würde der ganze Ausdruck (rechts vom =)
gescannt und alle Operanden würden in den größten Datentyp konvertiert.
Das làsst sich leicht widerlegen, denn in obigen Beispiel kommt 6.0f heraus.

Es dràngt sich mir der Gedanke auf, dass es so ist wie ich es von Java
zu wissen glaube:
Es werden die zwei Operanden jeder einzelnen Operation genommen, und
beide Operanden werden in den größeren der beiden Datentypen konvertiert
und die Operation ausgeführt. D.h. in obigem Beispiel wird erst 5/2
betrachtet und als Integer-Devision ausgeführt (Ergebnis 2). Danach wird
das Ergebnis der Division in float konvertiert (2.0f) und eine
float-Multiplikation ausgeführt.



Richtig. Wobei die float-Multiplikation beispielsweise auch als
double-Multiplikation durchgeführt werden kann, das bleibt dem Compiler
überlassen.

Kann das jemand bestàtigen bzw. mich berichtigen? Was passiert wenn ein
Operand uint32_t und der andere int32_t (also signed) ist? Der kleinste
Datentyp der beide umfasst wàre int64_t.



s.o., dann wird der int32_t nach uint32_t gewandelt.

Tom

Ähnliche fragen