Überlaufwarnung - aber wieso?



  • Hallo,

    ich bekomme beim folgenden Sourcecode den Compilerwarnung:W8056 Überlauf in mathematischem Integer-Ausdruck

    unsigned long long all_file_bitrate;
    		unsigned long long sum_duration=1;
    		all_file_bitrate=(((unsigned long long)4656137432/sum_duration*(unsigned long long)8))-(96*1024);
    

    und zwar in Zeile 3. Ich verstehe allerdings nicht wieso, denn die unsigned long long Grenze erreiche ich doch nicht. 😕

    Compiler ist Borland c++ builder 2006.

    Weiß jemand wieso?



  • Ja: Eine Zahl ohne Typspezifizierer ist im Quelltext zuallererst int. D.h. die Zahl wird als int interpretiert (wofür sie zu groß ist) und dann in unsigned long long umgewandelt. Da ist das Unglück aber schon passiert. Du musst die Zahl selbst als unsigned long long markieren (mittels ULL suffix):

    ((4656137432ULL/sum_duration*8ULL))-(96*1024)
    

    BTW: long long gehört in C++ (noch) nicht zum Standard. Also mit Vorsicht geniessen und bei Anwendung eines neuen Compilers nachschauen ob der es unterstützt 😉



  • Ah, verstehe, vielen Dank.
    Ich dachte das casten würde reichen.


Anmelden zum Antworten