es.davy.ai

Preguntas y respuestas de programación confiables

¿Tienes una pregunta?

Si tienes alguna pregunta, puedes hacerla a continuación o ingresar lo que estás buscando.

¿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

Tags:  , ,

Answer

  1. Avatar for 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 un int.

    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 a 0x80000000 en binario) y el número positivo más grande es 0x7fffffff.

    Para leer enteros hexadecimales negativos desde un archivo, simplemente puedes incluir el signo menos - antes de los dígitos hexadecimales. Por ejemplo:

    0
    -a
    -80000000
    ...
    

    En este caso, el flujo de entrada interpretará correctamente la entrada como números negativos.

Comments are closed.