logo

Complemento a dos

Hay tres formas diferentes de representar un entero con signo (artículo). a: bit con signo, b: complemento a 1 y c: complemento a 2. Intentemos comprender cómo se han derivado estos métodos y por qué se prefiere el complemento a 2 sobre otros.

Como sabemos, los datos se almacenan en bits. ¿Cómo podemos almacenar un entero con signo en la memoria? Para resolver este problema, primero desarrollaremos una solución ingenua y luego la repetiremos hasta que tengamos la mejor solución para nuestro problema.



a) Bit firmado

Al intentar almacenar un entero con signo, parece obvio reservar el bit más a la izquierda para el signo y usar los bits restantes para almacenar los valores. Por ejemplo: en un sistema de 4 bits, el primer bit de la izquierda se reservará para el signo (0 representa positivo mientras que 1 representa negativo) y se usarán otros 3 bits para almacenar los valores. De manera similar, en el sistema de 8 bits, el primer bit de la izquierda se usará para el signo y los 7 restantes se usarán para los valores.

Sr. No.

Representación binaria



Valor decimal

A

0000



+0

B

0001

+1

C

0010

+2

D

0011

+3

Y

0100

+4

F

0101

+5

GRAMO

0110

+6

h

0111

+7

I

1000

-0

j

1001

-1

k

1010

-2

l

1011

-3

METRO

1100

-4

norte

1101

-5

oh

1110

-6

PAG

1111

-7

Al utilizar este enfoque, podemos representar con éxito un entero con signo. Pero cuando lo analizamos más de cerca, podríamos observar los siguientes inconvenientes:

1) Dos representaciones del cero:

En un sistema de 4 bits, deberíamos poder almacenar 16 (24) valores, pero +1 a +7 y -1 a -7 son solo 14 valores. ¿Dónde quedan dos valores? Cuando observamos la tabla con atención, descubriremos que esos dos valores convergen a 0. Así, tenemos dos representaciones del cero, es decir, una representación para +0 y otra para -0.

¿Pero son dos representaciones de 0 una gran preocupación? ¿Así que lo que? En lugar de 16 valores únicos, sólo podemos almacenar 15 valores. Podemos darnos el lujo de reducir el rango en 1, ¿no es así? Para el desarrollador de software, puede que no le importe, pero para un diseñador de circuitos puede resultar muy frustrante comprobar primero si el valor es +0 y luego comprobar si es -0.

2) La extensión firmada no funciona con números negativos:

El tamaño de los datos está aumentando rápidamente. En algún momento necesitamos ampliar el sistema de bits para poder aumentar la gama de datos que se pueden almacenar. En 2014, el vídeo de Gangnam Style superó el límite de vistas de YouTube y obligó a YouTube a actualizar el recuento de vistas de 32 bits a 64 bits enteros con signo. De manera similar, el reloj Unix de 32 bits se desbordará el 19 de enero de 2038 porque registra el tiempo en segundos en un entero de 32 bits con signo.

Por lo tanto, es igualmente importante que nuestro sistema de representación sea fácilmente ampliable, lo que no es posible con este sistema de representación.

Decimal

4 bits

5 bits

6 bits

+2

0010

00010

000010

+7

0111

00111

000111

-2

1010

10010 (! = 11010)

100010 (! = 111010)

-7

1111

10111 (! = 11111)

100111 (! = 111111)

3) La suma binaria no funciona:

Intentemos sumar dos números binarios:

Binario

Decimal

Binario

Decimal

Binario

Decimal

Numero 1

0010

+2

0111

+7

1101

-5

Número 2

1010

-2

1010

-2

0011

+3

Suma binaria

1100

-4

0001

+1

0000

+0

Suma decimal

+0

+5

-2

¿Por qué una simple suma binaria no funciona aquí? La razón es que el bit de signo (más a la izquierda) no es un bit ordinario y no forma parte del número real. Imagine la situación en la que uno tiene que diseñar el circuito de hardware para ignorar el bit de signo para realizar la suma y luego agregar el bit de signo.

Entonces, esta era una forma ingenua de representar un entero con signo. El principal problema con este enfoque es que hemos mapeado los números negativos de abajo hacia arriba. Si cambiamos nuestro sistema de mapeo para verlos de arriba hacia abajo, algunos de los problemas anteriores se resolverán.

b) Co de 1 implementar

Si reasignamos nuestros números negativos de arriba hacia abajo, obtendremos la siguiente tabla binaria:

S. No.

Representación binaria

Valor decimal

complemento a 1

bit firmado

A

0000

+0

+0

B

0001

+1

+1

C

0010

+2

+2

D

0011

+3

+3

Y

0100

+4

+4

F

0101

+5

+5

GRAMO

0110

+6

+6

h

0111

+7

+7

I

1000

-7

-0

j

1001

-6

-1

k

1010

-5

-2

l

1011

-4

-3

METRO

1100

-3

-4

norte

1101

-2

-5

oh

1110

-1

-6

PAG

1111

-0

-7

¿Cómo obtener la representación binaria de un número entero en el método complemento a 1?

  • Los números positivos se representan de manera similar al método del entero con signo
  • Los números negativos se representan invirtiendo cada bit del número positivo correspondiente (la inversión se puede realizar fácilmente utilizando la puerta NOT durante el diseño del hardware)

Analicemos esto de cerca para ver si hemos logrado alguna mejora.

1) Dos representaciones del cero:

En este enfoque también tenemos dos representaciones de cero.

2) La extensión firmada no funciona con números negativos:

La extensión firmada funciona perfectamente para números negativos.

Decimal

4 bits

5 bits

6 bits

+2

0010

00010

000010

+7

0111

00111

000111

-2

1101

11101

111101

-7

1000

11000

111000

3) La suma binaria funciona con reglas modificadas:

Binario

Decimal

Binario

Decimal

Binario

Decimal

Numero 1

0010

+2

0111

+7

1010

-5

Número 2

1101

-2

1101

-2

0011

+3

Suma binaria

1111

-0

0100

+4

1101

-2

Suma decimal

+0

+5

-2

La respuesta no siempre es correcta, pero se acerca mucho a la respuesta correcta. Podemos hacerlo funcionar si seguimos la regla de que Si ha generado un arrastre en el bit más a la izquierda, no lo deseche, sino tráigalo y agréguelo al bit más a la derecha.

Binario

Decimal

Binario

Decimal

Binario

Decimal

Numero 1

0111

+7

1110

-1

0111

+7

Número 2

1101

-2

1001

-6

1011

-4

Suma binaria

(1) 0100

+4

(1) 0111

+7

(1) 0010

+2

Agregar arrastre hacia atrás

0101

+5

1000

-7

0011

+3

Definitivamente el método del complemento a 1 es mejor que el bit con signo. Nuestras principales preocupaciones están resueltas, pero siguen siendo un problema (tener dos representaciones de cero) y nuestro truco en la suma binaria brinda pistas para mejorar el método del complemento a 1. Reformulemos esas oraciones para hacerlo más fácil.

  • Tenemos una representación extra de cero que es innecesaria.
  • Al sumar dos números binarios, si tenemos un arrastre en el bit más a la izquierda, entonces tenemos que sumar +1 al resultado, es decir, la respuesta correcta se puede encontrar bajando a la siguiente fila de la tabla binaria.

Ambos nos indican que una representación adicional de cero es la causa fundamental del problema. Entonces, eliminemos este cero extra y cambiemos todos los valores negativos a la siguiente fila (-7 se moverá de I -> J, -6 se moverá de J -> K y así sucesivamente...)

c) Complemento a 2

Cuando eliminamos -0 de la tabla de complemento a 1 y desplazamos todos los valores negativos una fila más abajo, obtendremos la siguiente tabla que se llama complemento a 2:

S. No.

Representación binaria

Valor decimal

complemento a 2

complemento a 1

bit firmado

A

0000

+0

+0

+0

B

0001

+1

+1

+1

C

0010

+2

+2

+2

D

0011

+3

+3

+3

Y

0100

+4

+4

+4

F

0101

+5

+5

+5

GRAMO

0110

+6

+6

+6

h

0111

+7

+7

+7

I

1000

-8

-7

-0

j

1001

-7

= inverso de 7 + 1 bit

-6

-1

k

1010

-6

= inverso de 6 + 1 bit

-5

-2

l

1011

-5

= inverso de 5 + 1 bit

-4

-3

METRO

1100

-4

= inverso de 4 + 1 bit

-3

-4

norte

1101

-3

= inverso de 3 + 1 bit

-2

-5

oh

1110

-2

= inverso de 2 + 1 bit

-1

-6

PAG

1111

-1

= inverso de 1 + 1 bit

-0

-7

¿Cómo obtener la representación binaria de un número entero en el método del complemento a 2?

  • Los números positivos se representan de manera similar al método del entero con signo
  • Los números negativos se representan invirtiendo cada bit del número positivo correspondiente y luego añadiéndole 1 bit.

1) Una representación de cero:

Ahora tenemos sólo una representación de cero y nos permite almacenar total de 16 valores únicos (+0 a +7 y -1 a -8).

2) La extensión firmada funciona para números negativos:

La extensión firmada funciona perfectamente para números negativos.

Decimal

4 bits

5 bits

6 bits

+2

0010

00010

000010

+7

0111

00111

000111

-2

1110

11110

111110

-7

1001

11001

111001

3) Suma binaria:

Binario

Decimal

Binario

Decimal

Binario

Decimal

Binario

Decimal

Numero 1

0010

+2

0111

+7

1011

-5

1111

-1

Número 2

1110

-2

1110

-2

0011

+3

1010

-6

Respuesta

0000

+0

0101

+5

1110

-2

1001

-7

4) El primer bit es un bit con signo:

El complemento a 2 tiene esta buena propiedad de que el primer bit es un bit de signo porque todo lo positivo comienza con 0 mientras que todo lo negativo comienza con 1.

5) Verificación de desbordamiento de memoria:

Al realizar la suma, nos aseguramos de que nuestra respuesta esté dentro del rango, pero al diseñar el hardware, es necesario detectar el desbordamiento de la memoria. Será una muy mala idea que los diseñadores de hardware verifiquen la magnitud para detectar el desbordamiento. El método del complemento a 2 proporciona una forma muy sencilla de detectar el desbordamiento de la memoria. I Si el acarreo al bit con signo no es igual al acarreo del bit con signo, entonces es un caso de desbordamiento de memoria es decir, si el acarreo al bit con signo es 0 pero el acarreo es 1 o si el acarreo 1 pero el acarreo es 0, entonces es un caso de desbordamiento de memoria.

Binario

Decimal

Binario

Decimal

Binario

Decimal

Binario

Decimal

Numero 1

1011

-5

0010

2

0111

+7

1011

-5

Número 2

1100

-4

0110

6

declaración de caso de java
1110

-2

0011

3

Suma

(1) 0111

(0)1000

(1)0101

(0)1110

llevar al bit de signo

0

Desbordamiento

1

Desbordamiento

1

no

0

no

llevar a cabo para firmar bit

1

0

1

0