Warum sind A*B*C != int( A*B*C ) ?
-
Hallo,
ich bin auf eine Merkwürdigkeit des GNU C++ Compilers gestoßen:
Warum ist"A*B*C"!="static_cast<int32_t>( A*B*C )"?Beispiel:
#include <iostream> using namespace std; int main() { const int A = -78992; const unsigned short B = 60; const unsigned int C = 2; cout << A*B*C << " != " << static_cast<int32_t>( A*B*C ) << " ???" << endl; return( 0 ); }Ich weiß nicht ob das bei anderen C++ Compilern auch so ist.
Hat jemand eine Erklärung dafür?
Viele Grüße
Bastian
-
wieso,
was kriegst du für werter raus?
-
Es könnte daran liegen, dass unsigned int einen höheren Rang als int (int32_t) hat.
-
schern schrieb:
Hallo,
ich bin auf eine Merkwürdigkeit des GNU C++ Compilers gestoßen:
Das ist bei allen Compilern so, da wegen des fehlenden Rückgabetyps dieser über den Ausdruck "A*B*C" bestimmt wird, und da ein "unsigned" die größeren positiven Ganzzahlen halten kann, wird dieser als Rückgabetyp genommen, und das Ergebnis entsprechend konvertiert. In C++ (so auch in C) erfolgt leider keine Prüfung, ob der Wert negativ ist, und so nicht konvertiert werden kann. Dazu müßte man sich spezielle Klassen programmieren, die das unterstützen.