logo

Complement de dos

Hi ha tres maneres diferents de representar un nombre enter amb signe (article). a: bit signat, b: complement d'1 i c: complement de 2. Intentem entendre com s'han derivat aquests mètodes i per què es prefereix el complement de 2 sobre d'altres.

Com sabem, les dades s'emmagatzemen en bits. Com podem emmagatzemar un nombre enter amb signe a la memòria? Per resoldre aquest problema, primer desenvoluparem una solució ingènua i després la repetirem fins que tinguem la millor solució per al nostre problema.



a) Bit signat

Quan s'intenta emmagatzemar un nombre enter amb signe, sembla obvi reservar el bit més esquerre per al signe i utilitzar els bits restants per emmagatzemar els valors. Per exemple: en un sistema de 4 bits, el primer bit de l'esquerra es reservarà per al signe (0 representa positiu mentre que 1 representa negatiu) i s'utilitzaran altres 3 bits per emmagatzemar els valors. De la mateixa manera en el sistema de 8 bits, el primer bit des de l'esquerra s'utilitzarà per al signe i els 7 restants s'utilitzaran per als valors.

Sr. No.

Representació binària



Valor decimal

A

0000



+0

B

0001

+1

C

0010

+2

D

0011

+3

I

0100

+4

F

0101

+5

G

0110

+6

H

0111

+7

jo

1000

-0

J

1001

-1

K

1010

-2

L

1011

-3

M

1100

-4

N

1101

-5

O

1110

-6

P

1111

-7

Mitjançant aquest enfocament, podem representar amb èxit un nombre enter amb signe. Però quan ho analitzem amb més detall, podríem observar els següents inconvenients:

1) Dues representacions de zero:

En un sistema de 4 bits, hauríem de ser capaços d'emmagatzemar 16 (24) valors, però +1 a +7 i -1 a -7 són només 14 valors. On són els dos valors restants? Quan observem la taula detingudament, descobrirem que aquests dos valors convergeixen a 0. Així, tenim dues representacions de zero, és a dir, una representació per a +0 i una altra per a -0.

Però dues representacions de 0 són una gran preocupació? I què? En lloc de 16 valors únics, només podem emmagatzemar 15 valors. Ens podem permetre reduir el rang en 1, no? Per al desenvolupador de programari, potser no preocupa, però per a un dissenyador de circuits pot ser molt frustrant comprovar primer si el valor és +0 i després comprovar si és -0.

2) L'extensió signada no funciona per a números negatius:

La mida de les dades augmenta ràpidament. Algun temps hem d'ampliar el sistema de bits perquè puguem augmentar el rang de dades que es poden emmagatzemar. El 2014, el vídeo de Gangnam Style va desbordar el límit de visualització de YouTube i va obligar YouTube a actualitzar el recompte de visualitzacions de 32 bits a 64 bits enter signat. De la mateixa manera, el rellotge Unix de 32 bits es desbordarà el 19 de gener de 2038 perquè registra el temps en segons en un nombre enter signat de 32 bits.

Per tant, és igualment important que el nostre sistema de representació sigui extensible fàcilment, cosa que no és possible amb aquest sistema de representació.

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 binària no funciona:

Intentem sumar dos nombres binaris:

Binari

Decimal

Binari

Decimal

Binari

Decimal

Número 1

0010

+2

0111

+7

1101

-5

Número-2

1010

-2

1010

-2

0011

+3

Suma binària

1100

-4

0001

+1

0000

+0

Suma decimal

+0

+5

-2

Per què una simple addició binària no funciona aquí? La raó és que el bit de signe (el més a l'esquerra) no és un bit normal i no forma part del nombre real. Imagineu la situació en què s'ha de dissenyar els circuits de maquinari per ignorar el bit de signe per realitzar l'addició i després afegir el bit de signe.

Per tant, aquesta era una manera ingènua de representar un nombre enter amb signe. El principal problema d'aquest enfocament és que hem mapejat nombres negatius cap amunt. Si canviem el nostre sistema de mapes de dalt a baix, alguns dels problemes anteriors es resoldran.

b) 1's Co implementar

Si tornem a mapejar els nostres nombres negatius de dalt a baix, obtindrem la següent taula binària:

S. No.

Representació binària

Valor decimal

complement de 1

Bit signat

A

0000

+0

+0

B

0001

+1

+1

C

0010

+2

+2

D

0011

+3

+3

I

0100

+4

+4

F

0101

+5

+5

G

0110

+6

+6

H

0111

+7

+7

jo

1000

-7

-0

J

1001

-6

-1

K

1010

-5

-2

L

1011

-4

-3

M

1100

-3

-4

N

1101

-2

-5

O

1110

-1

-6

P

1111

-0

-7

Com obtenir la representació binària d'un nombre enter en el mètode del complement 1?

  • Els nombres positius es representen de manera semblant al mètode d'enters amb signe
  • Els nombres negatius es representen invertint cada bit del nombre positiu corresponent (la inversió es pot fer fàcilment utilitzant la porta NOT durant el disseny del maquinari)

Analitzem-ho de prop per veure si hem aconseguit alguna millora.

1) Dues representacions de zero:

En aquest enfocament també tenim dues representacions de zero.

2) L'extensió signada no funciona per a números negatius:

L'extensió signada funciona perfectament per a nombres negatius.

Decimal

4 bits

5 bits

6 bits

+2

0010

00010

000010

+7

0111

00111

000111

-2

1101

11101

111101

-7

1000

11000

111000

3) L'addició binària funciona amb regles modificades:

Binari

Decimal

Binari

Decimal

Binari

Decimal

Número 1

0010

+2

0111

+7

1010

-5

Número-2

1101

-2

1101

-2

0011

+3

Suma binària

1111

-0

0100

+4

1101

-2

Suma decimal

+0

+5

-2

La resposta no sempre és correcta, però està molt a prop de la resposta correcta. Podem fer que funcioni si seguim la regla que si heu generat el transport endavant a la part més esquerra, no la llenceu, sinó que la torneu i afegiu-la a la part més dreta.

Binari

Decimal

Binari

Decimal

Binari

Decimal

Número 1

0111

+7

1110

-1

0111

+7

Número-2

1101

-2

1001

-6

1011

-4

Suma binària

(1) 0100

+4

(1) 0111

+7

(1) 0010

+2

Afegint el transport endavant enrere

0101

+5

1000

-7

0011

+3

Definitivament, el mètode del complement 1 és millor que el bit signat. Les nostres principals preocupacions s'han resolt, però segueixen sent un problema (tenint dues representacions de zero) i el nostre hack en addició binària donen pistes per millorar el mètode del complement 1. Reformularem aquestes frases per fer-ho més fàcil.

  • Tenim una representació addicional de zero que és innecessària
  • Tot i que sumem dos nombres binaris, si tenim un avançament al bit més esquerre, hem de sumar +1 al resultat, és a dir, la resposta correcta es pot trobar desplaçant-nos fins a la següent fila de la taula binària.

Tots dos ens indiquen que una representació addicional de zero és la causa principal del problema. Per tant, eliminem aquest zero addicional i canviem tots els valors negatius a la fila següent (-7 es mourà de I -> J, -6 es mourà de J -> K i així successivament...)

c) Complement de 2

Quan eliminem -0 de la taula del complement a 1 i desplacem tots els valors negatius una fila per sota, obtindrem la taula següent que s'anomena complement a 2:

S. No.

Representació binària

Valor decimal

complement de 2

complement de 1

Bit signat

A

0000

+0

+0

+0

B

0001

+1

+1

+1

C

0010

+2

+2

+2

D

0011

+3

+3

+3

I

0100

+4

+4

+4

F

0101

+5

+5

+5

G

0110

+6

+6

+6

H

0111

+7

+7

+7

jo

1000

-8

-7

-0

J

1001

-7

= invers de 7 + 1 bit

-6

-1

K

1010

-6

= invers de 6 + 1 bit

-5

-2

L

1011

-5

= invers de 5 + 1 bit

-4

-3

M

1100

-4

= invers de 4 + 1 bit

-3

-4

N

1101

-3

= invers de 3 + 1 bit

-2

-5

O

1110

-2

= invers de 2 + 1 bit

-1

-6

P

1111

-1

= invers d'1 + 1 bit

-0

-7

Com obtenir la representació binària d'un nombre enter en el mètode del complement a 2?

  • Els nombres positius es representen de manera semblant al mètode d'enters amb signe
  • Els nombres negatius es representen invertint cada bit del nombre positiu corresponent i afegint-hi 1 bit

1) Una representació de zero:

Ara només tenim una representació de zero i ens permet emmagatzemar total de 16 valors únics (+0 a +7 i -1 a -8).

2) L'extensió signada funciona per a nombres negatius:

L'extensió signada funciona perfectament per a nombres negatius.

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 binària:

Binari

Decimal

Binari

Decimal

Binari

Decimal

Binari

Decimal

Número 1

0010

+2

0111

+7

1011

-5

1111

-1

Número-2

1110

-2

1110

-2

0011

+3

1010

-6

Respon

0000

+0

0101

+5

1110

-2

cadena.valor de java

1001

-7

4) El primer bit és un bit signat:

El complement de 2 té aquesta bonica propietat que el primer bit és un bit de signe perquè tots els positius comencen amb 0 mentre que tots els negatius amb 1.

5) Comprovació de desbordament de memòria:

Mentre vam fer l'addició, ens vam assegurar que la nostra resposta estigui dins del rang, però mentre dissenyem el maquinari, cal detectar un desbordament de memòria. Serà molt mala idea per als dissenyadors de maquinari comprovar la magnitud per detectar el desbordament. El mètode de complement de 2 proporciona una manera molt senzilla de detectar el desbordament de memòria. jo f carry in to signed bit no és igual a carry out of signed bit, llavors és un cas de desbordament de memòria és a dir, si l'entrada al bit signat és 0 però l'execució és 1 o si l'entrada a 1 però l'execució és 0, llavors és un cas de desbordament de memòria.

Binari

Decimal

Binari

Decimal

Binari

Decimal

Binari

Decimal

Número 1

1011

-5

0010

2

0111

+7

1011

-5

Número-2

1100

-4

0110

6

1110

-2

0011

3

Addició

(1) 0111

(0)1000

(1)0101

(0)1110

portar a signar bit

0

desbordament

1

desbordament

1

no

0

no

dur a terme per signar bit

1

0

1

0