Tengo el siguiente código:MSVC++: Extrañeza con enteros sin signo y desbordamiento
#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;
}
}
}
Si puedo compilar el MSVC con optimizaciones completo, la salida que se ve es "-1?". Si compilo en modo Debug (sin optimizaciones), no obtengo salida (esperado).
Pensé que el estándar garantizaba que los enteros sin signo se desbordaran de manera predecible, de modo que cuando i = (unsigned int) (- 1) , i + 1 = 0, y la condición de bucle i + 1> = 1 falla. En cambio, la prueba de alguna manera está pasando. ¿Es esto un error del compilador, o estoy haciendo algo indefinido en alguna parte?
Hmm. Otros (en diferentes sitios) están citando la sección 4.7 de la norma: http://dev.feuvan.net/docs/isocpp/conv.html Están usando esto para argumentar que está definido. –
De 3.9.1 4, y su nota al pie, tuve la impresión de que los enteros sin signo son una excepción: dado que 1 se agrega en la aritmética del mod 2^n, el resultado no puede estar fuera del rango de valores, ¿verdad? –
En la conversión a un tipo firmado (como en el caso aquí), el resultado está definido por la implementación. Debido a que el valor cae fuera del rango de * ambos * tipos en una operación firmada, tomo esto para caer bajo la sección 5. El compilador está mal aquí, de cualquier manera. – greyfade