ich den folgenden Code habe:MSVC++: Fremdheit mit unsigned ints und Überlauf
#include <iostream>
using namespace std;
int main(int argc, char *argv[])
{
string a = "a";
for(unsigned int i=a.length()-1; i+1 >= 1; --i)
{
if(i >= a.length())
{
cerr << (signed int)i << "?" << endl;
return 0;
}
}
}
Wenn ich in MSVC mit vollen Optimierungen zu kompilieren, die Ausgabe erhalte ich "-1?". Wenn ich im Debug-Modus (keine Optimierungen) kompiliere, bekomme ich keine Ausgabe (erwartet.)
Ich dachte der Standard garantiert, dass vorzeichenlose Integer in einer vorhersagbaren Weise übergelaufen, so dass, wenn i = (unsigned int) (- 1) , i + 1 = 0, und die Schleifenbedingung i + 1> = 1 schlägt fehl. Stattdessen ist der Test irgendwie vorbei. Ist das ein Compiler Bug, oder mache ich irgendwas Undefiniertes?
Hmm. Andere (auf verschiedenen Seiten) zitieren Abschnitt 4.7 des Standards: http://dev.feuvan.net/docs/isocpp/conv.html Sie verwenden dies um zu argumentieren, dass es definiert ist. –
Ab 3.9.1 4 und seiner Fußnote hatte ich den Eindruck, dass vorzeichenlose Ganzzahlen eine Ausnahme sind: Da 1 in der Arithmetik von mod 2^n addiert wird, kann das Ergebnis nicht außerhalb des Wertebereichs liegen, oder? –
Bei der Konvertierung in einen signierten Typ (wie hier) ist das Ergebnis implementierungsdefiniert. Da der Wert in einer signierten Operation außerhalb des Bereichs von * both * -Typen liegt, nehme ich an, dass dies unter Abschnitt 5 fällt. Der Compiler ist hier falsch, egal wie. – greyfade