online - ¿Cómo saber si un número entero binario representa un número negativo?
numeros binarios negativos (5)
Estoy leyendo un texto en C En la sesión de Valores negativos y positivos, el autor mencionó varias formas de representar un número negativo en forma binaria.
Comprendí todo el camino y me preguntaba si con un número binario dado, ¿podemos determinar si es negativo?
Por ejemplo, el -92 tiene la forma binaria de 8 bits: 10100100
. Pero si nos dan 10100100
¿podemos decir que es -92 y no otro número no negativo?
Por ejemplo, el (número) -92 tiene la forma binaria: 10100100 (en una representación de bytes de 8 bits). Pero si nos dan 10100100, ¿podemos decir que es -92 y no otro número no negativo?
No, deberá saber de antemano si un almacenamiento firmado o sin firmar se ha utilizado para almacenar el número, y también necesitará saber la encoding utilizada para almacenar el número.
Si el entero de 8 bits (es decir, el byte) está firmado, entonces, según Tom y 32bitkid, los enteros con signo generalmente se almacenan en el complemento de 2 , donde el bit más significativo determinará si un número es negativo o no.
Por ejemplo, en su ejemplo, el byte 10100100
podría representar el byte firmado -92
, ya que:
MSB : 1 means negative
Other 7 Bits 0100100
Flip and add 1 => 1011011 + 1 = 1011100
From powers of two, right to left :
0*2^0 + 0*2^1 + 1*2^2 + 1*2^3 + 1*2^4 + 0*2^5 + 1*2^6
= 4 + 8 + 16 + 64
= 92 (and thus -92 because of the MSB)
O si el valor es un byte sin signo, entonces el MSB se trata como la siguiente potencia de 2, lo mismo que todos los bits inferiores, es decir, 10100100
podría representar:
(De nuevo, potencias de dos, de derecha a izquierda, y omitiendo las potencias 0
de dos)
4 + 32 + 128
= 164
La decisión de si un entero debe estar firmado o no está generalmente determinada por el rango de valores que necesita almacenar en él. Por ejemplo, un entero con signo de 32 bits puede representar el rango:
–2147483648 to 2147483647
Mientras que un entero de 32 bits sin signo puede representar números de
0 to 4294967295
Depende de la representación, por supuesto. En el complemento a dos, que se usa ampliamente, simplemente se mira la parte más significativa.
Quieres leer los números de complemento de dos . En resumen, el bit más significativo se puede usar para determinar si el número es negativo.
Volví a leer tu pregunta y dijiste que ya comprendías el complemento de dos. Cuando se trata de números negativos, se debe conocer el número de bits para determinar si el número es negativo o no. Un número negativo debe ser signo extendido al número requerido de bits. Su ejemplo de -92 cuando se almacena en 32 bits sería 1111111111111111111111111010100100.
Se le debe solicitar que sepa el tipo (firmado / sin firmar) del número para determinar el número negativo / positivo. Si no se menciona el tipo, entonces por defecto está firmado. Si está firmado, entonces puede mirar el bit MSB para determinar un no positivo o negativo. Si se menciona como no firmado, debe contar el bit MSB para hacer un decimal.
Si tiene el valor en la memoria, conviértalo en un archivo con el mismo tamaño y compruebe si es menor que cero. Entonces, if ((int)value < 0)
.
Si está intentando analizar una constante binaria de una cadena, necesita saber el formato del número. Sin embargo, el complemento a dos ha sido universal durante cincuenta años. (La única excepción es el soporte compatible con binarios para ciertos mainframes Unisys antiguos que aún se están utilizando). Para eso, solo necesita mirar el primer bit (como dice la respuesta aceptada).