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.


Anmelden zum Antworten