| Binario (positivo) - Complemento a 2 (negativo) | Decimal |
| --- | --- |
| 0111 | 7 |
| 0110 | 6 |
| 0101 | 5 |
| 0100 | 4 |
| 0011 | 3 |
| 0010 | 2 |
| 0001 | 1 |
| 0000 | 0 |
| 1111 | −1 |
| 1110 | −2 |
| 1101 | −3 |
| 1100 | −4 |
| 1011 | −5 |
| 1010 | −6 |
| 1001 | −7 |
| 1000 | −8 |
|

**Complemento a dous con enteiros de 4 bits**

O **complemento a dous** dun número ***N*** que, expresado no sistema binario con ***n*** díxitos, defínese como {\displaystyle C\_{2}^{N}=2^{n}-N}

O total de números positivos será {\displaystyle 2^{n-1}-1} e o de negativos {\displaystyle 2^{n-1}}, sendo n o número máximo de bits. O {\displaystyle 0} contaría á parte.

Vexamos un exemplo: tomemos o número que, cando se expresa en binario é {\displaystyle N=45}, con 6 díxitos, e calculemos o seu complemento a dous: {\displaystyle N=101101\_{2}}

{\displaystyle N=45}, {\displaystyle n=6}; {\displaystyle 2^{6}=64} e, por tanto: {\displaystyle C\_{2}^{N}=64-45=010011\_{2}}
Pode parecer confuso, pero é moi fácil obter o complemento a dous dun número a partir do seu complemento a un, porque o complemento a dous dun número binario é unha unidade maior que o seu complemento a un, é dicir:

{\displaystyle C\_{2}^{N}=C\_{1}^{N}+1}
Cómpre sinalar que neste exemplo limitouse o número de bits a {\displaystyle 6}, polo que non sería posible distinguir entre o -45 e o 19 (o 19 en binario é {\displaystyle 10011}). En realidade, un número en complemento a dous exprésase cunha cantidade arbitraria de uns á esquerda, da mesma maneira que un número binario positivo exprésase cunha cantidade arbitraria de ceros. Así, o -45, expresado en complemento a dous usando {\displaystyle 8} bits sería {\displaystyle 11010011}, mentres que o 19 sería {\displaystyle 00010011}; e expresados en {\displaystyle 16} bits serían {\displaystyle 1111111111010011} e {\displaystyle 0000000000010011} respectivamente. Preséntase a táboa de verdade do complemento a 2 para catro díxitos.

Cálculo do complemento a dous
-----------------------------

O cálculo do complemento a dous é moi sinxelo e moi fácil de realizar mediante portas lóxicas, onde reside a súa utilidade.

Para comezar, os números positivos quedarán igual na súa representación binaria. Nos números negativos deberemos inverter o valor de cada unha das súas cifras, é dicir realizar o complemento a un, e sumarlle 1 ao número obtido. Podemos observar isto na táboa de exemplo.

Cabe lembrar que debido á utilización dun bit para representar o signo, o rango de valores será diferente ao dunha representación binaria habitual; o rango de valores decimais para n bits será: {\displaystyle -2^{n-1}\leq \ Rango\leq \ 2^{n-1}-1}

Conversión rápida
-----------------

Unha forma de achar o oposto dun número binario positivo en complemento a dous é comezar pola dereita (o díxito menos significativo), copiando o número orixinal (de dereita a esquerda) até atopar o primeiro 1, despois de copiar o 1, néganse (complementan) os díxitos restantes (é dicir, copia un 0 se aparece un 1, ou un 1 se aparece un 0). Este método é moito máis rápido para as persoas, pois non utiliza o complemento a un na súa conversión. Por exemplo, o complemento a dous de «0011 1101**0**» é «1100 001**1**0»-

Outra forma é negar todos os díxitos (áchase o complemento a 1) e despois sumar un 1 ao resultado, vén ser o mesmo que o anteriormente explicado.

{\displaystyle 100001--->011110-->011111}

É equivalente negar todos os díxitos facendo XOR contra un número coa mesma cantidade de díxitos binarios pero cheo de uns e sumar 1 ao resultado. Na práctica podería explicarse como:

{\displaystyle 100001} XOR {\displaystyle 111111=011110} e agregando 1 {\displaystyle =011111}

Para implementalo nunha rutina escrita na linguaxe de programación C, asumindo que x é a cantidade á que se lle calculará o complemento a 2, n o número máximo de bits das cantidades representadas e e a variable onde se almacenará o resultado. O cálculo podería escribirse como:

```
y=((x^^(2^n-1)++))&&(2^n-1);
```

Se n non vai cambiar ao longo do programa, pode substituírse como unha constante e con iso acelerar o cálculo e diminuír os recursos de cómputo consumidos. Por exemplo, se todos os cálculos son en {\displaystyle 8} bits, a rutina anterior podería simplificarse a:

```
y=((x^^0xFF)++)&&0xFF;
```

Aplicacións
-----------

A súa utilidade principal atópase nas operacións matemáticas con números binarios. En particular, a resta de números binarios facilítase enormemente utilizando o complemento a dous: esta pode obterse **sumando ao minuendo o complemento a dous do sustraendo**. Utilízase porque a unidade aritmético-lóxica non resta números binarios, suma binarios negativos, por iso esta conversión ao negativo.

Véxase tamén
------------

### Outros artigos

* Complemento a un
* Aritmética de saturación

Notas
-----

1. ↑  Rautenberg, Hans (2005). "Sistemas numéricos". *Diseño de circuitos digitales* (en castelán). Concepción, Chile: Universidad de Concepción. ISBN 956-8029-66-4.

|  |  |
| --- | --- |
| Control de autoridades | 
* Wd: Q232577
* MAG: 70087712

 |