Como la mayoría de las explicaciones que he visto, las anteriores son claras sobre cómo trabajar con el complemento de 2, pero en realidad no explican qué son matemáticamente. Intentaré hacer eso, al menos para enteros, y cubriré algunos antecedentes que probablemente sean familiares primero.
Recordemos cómo funciona para el decimal:
2345
es una forma de escribir
2 × 10 3 + 3 × 10 2 + 4 × 10 1 + 5 × 10 0 .
De la misma manera, el binario es una forma de escribir números usando solo 0 y 1 siguiendo la misma idea general, pero reemplazando los 10s anteriores con 2s. Luego, en binario,
1111
es una forma de escribir
1 × 2 3 + 1 × 2 2 + 1 × 2 1 + 1 × 2 0
y si lo resuelves, resulta ser igual a 15 (base 10). Eso es porque es
8 + 4 + 2 + 1 = 15.
Todo esto está muy bien para los números positivos. Incluso funciona para números negativos si está dispuesto a pegar un signo menos frente a ellos, como lo hacen los humanos con números decimales. Eso incluso se puede hacer en computadoras, más o menos, pero no he visto una computadora así desde principios de la década de 1970. Dejaré las razones para una discusión diferente.
Para las computadoras resulta más eficiente usar una representación de complemento para números negativos. Y aquí hay algo que a menudo se pasa por alto. Las anotaciones de complemento implican algún tipo de inversión de los dígitos del número, incluso los ceros implícitos que vienen antes de un número positivo normal. Eso es incómodo, porque surge la pregunta: ¿todos ellos? Eso podría ser un número infinito de dígitos para ser considerado.
Afortunadamente, las computadoras no representan infinitos. Los números están restringidos a una longitud particular (o ancho, si lo prefiere). Entonces volvamos a los números binarios positivos, pero con un tamaño particular. Usaré 8 dígitos ("bits") para estos ejemplos. Entonces nuestro número binario realmente sería
00001111
o
0 × 2 7 + 0 × 2 6 + 0 × 2 5 + 0 × 2 4 + 1 × 2 3 + 1 × 2 2 + 1 × 2 1 + 1 × 2 0
Para formar el complemento negativo de 2, primero complementamos todos los dígitos (binarios) para formar
11110000
y agregamos 1 para formar
11110001,
pero ¿cómo debemos entender que significa -15?
La respuesta es que cambiamos el significado del bit de orden superior (el más a la izquierda). Este bit será un 1 para todos los números negativos. El cambio será cambiar el signo de su contribución al valor del número en el que aparece. Así que ahora se entiende que nuestro 11110001 representa
- 1 × 2 7 + 1 × 2 6 + 1 × 2 5 + 1 × 2 4 + 0 × 2 3 + 0 × 2 2 + 0 × 2 1 + 1 × 2 0
Observe que "-" delante de esa expresión? Significa que el bit de signo lleva el peso -2 7 , que es -128 (base 10). Todas las otras posiciones conservan el mismo peso que tenían en números binarios sin signo.
Calculando nuestro -15, es
-128 + 64 + 32 + 16 + 1
Pruébelo en su calculadora. es -15.
De las tres formas principales en que he visto números negativos representados en las computadoras, el complemento de 2 gana sin dudas por conveniencia en el uso general. Sin embargo, tiene una rareza. Como es binario, debe haber un número par de posibles combinaciones de bits. Cada número positivo puede emparejarse con su negativo, pero solo hay un cero. Negar un cero te hace cero. Así que hay una combinación más, el número con 1 en el bit de signo y 0 en todos los demás. El número positivo correspondiente no encajaría en el número de bits que se utilizan.
Lo que es aún más extraño acerca de este número es que si intentas formar su positivo al complementar y sumar uno, obtienes el mismo número negativo. Parece natural que cero haga esto, pero esto es inesperado y no es el comportamiento al que estamos acostumbrados porque, aparte de las computadoras, generalmente pensamos en un suministro ilimitado de dígitos, no en esta aritmética de longitud fija.
Esto es como la punta de un iceberg de rarezas. Hay más al acecho debajo de la superficie, pero eso es suficiente para esta discusión. Probablemente podría encontrar más si investiga el "desbordamiento" para la aritmética de punto fijo. Si realmente quiere entrar en él, también puede investigar "aritmética modular".