¿std::hex no puede procesar números negativos?
Estoy intentando usar std::hex para leer enteros hexadecimales de un archivo.
Estos enteros pueden ser tanto positivos como negativos.
Parece ser que std::hex no puede manejar números negativos. No entiendo por qué y no veo un rango definido en la documentación.
Aquí hay un banco de pruebas:
#include <iostream>
#include <sstream>
#include <iomanip>
int main () {
int i;
std::stringstream ss;
// Este es el número más pequeño
// que se puede almacenar en 32 bits -1*2^(31)
ss << "80000000";
ss >> std::hex >> i;
std::cout << std::hex << i << std::endl;
}
Salida:
7fffffff
davy.ai
Es importante entender que
std::hex
es solo una marca de formato, que indica a los flujos de entrada/salida que interpreten los valores de entrada/salida como hexadecimal en lugar de decimal. No afecta al rango de valores que se pueden almacenar en unint
.En el banco de pruebas proporcionado, el valor de entrada
"80000000"
es un número negativo en representación decimal (-2147483648
). Sin embargo, en representación hexadecimal, se convierte en un número positivo (0x80000000
). Esto se debe a que el bit más a la izquierda de un entero con signo representa el signo (0
para positivo,1
para negativo) y en la representación de complemento a dos (que se utiliza comúnmente para enteros con signo), la representación binaria de-1
es todo 1 (0xffffffff
en hexadecimal). Por lo tanto, el número negativo más grande que se puede representar en un entero con signo de 32 bits es-0x7fffffff - 1
(que corresponde a0x80000000
en binario) y el número positivo más grande es0x7fffffff
.Para leer enteros hexadecimales negativos desde un archivo, simplemente puedes incluir el signo menos
-
antes de los dígitos hexadecimales. Por ejemplo:En este caso, el flujo de entrada interpretará correctamente la entrada como números negativos.