Ho il seguente codice:MSVC++: stranezza con unsigned int e troppopieno
#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;
}
}
}
Se posso compilare in MSVC con le ottimizzazioni pieno, l'uscita ottengo è "-1?". Se compilo in modalità Debug (nessuna ottimizzazione), non ottengo output (previsto)
Ho pensato che lo standard garantiva che gli interi non firmati fossero in overflow in modo prevedibile, così che quando i = (unsigned int) (- 1) , i + 1 = 0 e la condizione del ciclo i + 1> = 1 non riesce. Invece, il test sta passando in qualche modo. È un bug del compilatore o sto facendo qualcosa di indefinito da qualche parte?
Hmm. Altri (su siti diversi) citano la sezione 4.7 dello standard: http://dev.feuvan.net/docs/isocpp/conv.html Lo stanno usando per sostenere che è definito. –
Dalla 3.9.1 4, e la sua nota in calce, ho avuto l'impressione che gli interi senza segno siano un'eccezione: poiché 1 è aggiunto nell'aritmetica della mod 2^n, il risultato non può essere al di fuori dell'intervallo di valori, giusto? –
In conversione in un tipo firmato (come nel caso qui), il risultato è definito dall'implementazione. Poiché il valore non rientra nell'intervallo * di entrambi i tipi in un'operazione firmata, prendo questo per rientrare nella sezione 5. Il compilatore è sbagliato qui, in entrambi i casi. – greyfade