Skurrile Arithmetik von Stringlängen
-
Hallo,
folgende zwei Zeilen Code
cout << MAX_LEN_HEADER_BOTTOM << " " << DESCRIPTION.length() << " " << str.length() << endl; cout << MAX_LEN_HEADER_BOTTOM - DESCRIPTION.length() - str.length() << endl;liefern die Ausgabe
80 11 70
18446744073709551615wobei
const int MAX_LEN_HEADER_BOTTOM = 80; const string DESCRIPTION = " BEGIN OF: ";und str ein string ist. Weiss jemand, was hier passiert und wie man es abstellt.
-
Die ausgegebene Zahl entspricht 0xFFFFFFFFFFFFFFFF, also -1 - Dein Compiler behandelt das offensichtlich als einen unsigned 64Bit Integer - Wert, und gibt es deshalb als positiven Wert aus.
Leider kann ich Dir weder sagen, warum er das tut, noch wie man es abstellt ...
-
cout << MAX_LEN_HEADER_BOTTOM - static_cast<ptrdiff_t>(DESCRIPTION.length()) - static_cast<ptrdiff_t>(str.length()) << endl;BTW: warum er das tut? Weil size_t (Return-Typ von std::string::length) eben unsigned ist.
-
hustbaer schrieb:
BTW: warum er das tut? Weil size_t (Return-Typ von std::string::length) eben unsigned ist.
Danke, das läuft jetzt. Aber warum wandelt er bei arithmetischen Operationen, die sowohl int (MAX_LEN_HEADER_BOTTOM ist ein int) als auch unsigned int involvieren, die Typen auf solch bizarre Weise um?
Ich hätte angenommen, in so einem Fall würden alle unsigned int in int umgewandelt (wobei zu große unsigned int-Werte dann zu negativen int-Werten führen), aber das ist ja offenkundig nicht der Fall
-
Lies dir die "integral promotion" und "standard promotion" Regeln im C++ Standard durch.
IIRC nimmt er unsigned wenn er keinen grösseren signed Typ hat.