Conceptos básicos de números binarios con signo y explicación de rangos de diferentes tipos de datos. Si pregunto cuál es el valor de (1000 0000) 2 en decimal, seguramente surgirán dos respuestas ambiguas (-128) 10 y (+128) 10 .
La respuesta es realmente ambigua ya que ambas respuestas son correctas.
Entonces surge el concepto de números con y sin signo para ayudar a superar la ambigüedad.
Ahora, si se da como un número sin signo, (+128) 10 es la respuesta correcta porque no hay bit de signo en el caso de números sin signo. Por lo tanto, aquí el MSB (bit más significativo) no está reservado para representar el signo del número.
Pero en caso de que se dé que es número con signo, el (-128) 10 es la respuesta correcta.
En el caso de números con signo, el MSB se reserva para representar el signo del número.
Por lo tanto, si el número es de n bits, entonces en este 1 bit se usa para representar el signo del número y el resto (n-1) bits se usan para representar la magnitud del número.
Métodos para representar un número con signo :
- Formulario de magnitud de signo
- Formulario de complemento de 1
- Formulario de complemento a 2
Estos se explican a continuación a continuación.
- Formulario de magnitud de signo:
aquí, el MSB está reservado para bits con signo, al usar bits de descanso (n-1) podemos obtener directamente el valor decimal usando la fórmula normal de conversión binaria a decimal (al multiplicar 2i donde i representa la posición de índice de LSB (bit menos significativo)). Tenga en cuenta que el índice comienza desde 0, no desde 1 desde el lado LSB. - Forma de complemento a 1 :
aquí, el MSB está reservado para el bit con signo, y los bits restantes (n-1) se almacenan en forma de complemento a 1 del número.Lo que quiero decir quedará claro en el siguiente ejemplo:
Considere representar -7 usando 4 bits en complemento a 1.
Aquí dado, 4 bits por lo que MSB 1 bit reservado para representar el signo. Entonces, ahora nos quedan 3 bits.
Y sabemos (+7) 10 =(111 2 .Pero se da para almacenar el número en forma de complemento a 1, por lo tanto, se calcula el complemento a 1 de (+7).
Complemento a 1 de (+7) 10 =(000) 2 . (Como el complemento de 1 se calcula para convertir los ceros en unos y viceversa).Así, finalmente, la representación en complemento a 1 de (-7) 10 =(1000) 2 . (usando 4 bits).
- Forma de complemento a 2 :
aquí, el MSB está reservado para el bit con signo, y los bits restantes (n-1) se almacenan en forma de complemento a 2 del número.Lo que quiero decir quedará claro en el siguiente ejemplo:
Considere el mismo ejemplo explicado anteriormente, es decir, represente -7 usando 4 bits pero ahora en complemento a 2.
Aquí dado, 4 bits, por lo que MSB 1 bit reservado para representar el signo. Entonces, ahora nos quedan 3 bits.
Y sabemos (+7) 10 =(111) 2 .Pero se da para almacenar el número en forma de complemento a 2, por lo tanto, se calcula el complemento a 2 de (+7).
Complemento a 1 de (+7) 10 = (001) 2. (Como el complemento a 2 se calcula para convertir los ceros en unos y viceversa) y sumando 1 al resultado que obtenemos después de invertir los bits.En otras palabras,
Así, finalmente, la representación en complemento a 2 de (-7) 10 = (1001) 2 . (utilizando 4 bits).
Pero espere, hay ambigüedad, ¿cómo puede (-128) 10 = (1000 0000) 2 en el número firmado de 8 bits 2?
Pero el truco está aquí, pensemos que no sabemos qué representa (1000 0000) 2 y le sumamos (+127) 10 y después de sumar el resultado que obtuvimos es (1111 1111) 2 = (-1) 10 . Por lo tanto, el único valor posible de (1000 0000) 2 es (-128) 10 en forma de número con signo de 8 bits 2.
Ahora bien, este concepto está permitido en el complemento a 2 porque en el complemento a 2 existe el concepto de (0 negativo). Si queremos calcular tomando el complemento a 2 de (1000 0000) 2 , luego de ignorar los MSB (bit de signo), el complemento a 1 del número es (111 1111) y el complemento a 2 es (000 0000). Por lo tanto, la magnitud es 0 y el signo es negativo. El número decimal que deberíamos obtener es (-0), pero como ya he dicho, no existe el concepto de (0 negativo) en el complemento a 2.
Así, esto confirma (-128) 10 =(1000 0000) 2 .
Los rangos en los tipos de datos en los lenguajes de programación se pueden explicar con esto. Ahora, todos los (tipos de datos) cortos en c++/java son de 2 bytes, es decir, 16 bits, y decimos que el rango es de (-32, 768 a 32, 767). Ahora, solo observe que el rango de números positivos es hasta -32, 768 pero el número positivo es solo hasta 32, 767, es decir, el rango negativo es más que el rango de números positivos (hablando solo de la magnitud de ambos lados) pero podría estar pensando que tanto el los rangos positivo y negativo deberían ser iguales, pero aquí no son iguales.
Confundido por qué así?
La razón de lo mismo es el concepto que expliqué anteriormente, por lo que el rango negativo es uno más que el rango positivo (1000 0000 0000 0000) 2 es (-32, 768) 10 . Este concepto se puede extender a todos los tipos de datos y es la razón detrás de los rangos de todos los tipos de datos que usamos en nuestros lenguajes de programación.