Quiero leer enteros sin signo en la representación de base-10 (decimal) desde un iostream de C++ con al menos una detección de error rudimentaria. En mi opinión, los signos menos serían claramente un error en este caso, porque los enteros sin signo no tienen signo. Sin embargo, el CCG es de otra opinión:¿Cómo detectar números negativos como errores de análisis al leer enteros sin signo?
#include <iostream>
#include <sstream>
int main() {
std::stringstream a("5"), b("-0"), c("-4");
unsigned int i;
a >> i; if (a) std::cout << i << std::endl; else std::cout << "Conversion failure" << std::endl;
b >> i; if (b) std::cout << i << std::endl; else std::cout << "Conversion failure" << std::endl;
c >> i; if (c) std::cout << i << std::endl; else std::cout << "Conversion failure" << std::endl;
return 0;
}
me da una salida de
4294967292
para la última línea, como si un entero con signo -4 había sido leído y convertido a unsigned int.
Appearently, the GCC people see this as a feature. ¿Hay algún estándar que ordene este comportamiento, y hay alguna forma de escribir un analizador propio para salir de él, es decir, detectar "-4" (y tal vez "-0") como errores de conversión?
¿Has publicado el informe de error correcto? Ese está marcado como "fijo" sin ninguna resistencia. – spraff
@spraff: Parece que sí, este menciona el comportamiento del número negativo. – thiton