El complemento a dos es una forma inteligente de almacenar números enteros para que los problemas matemáticos comunes sean muy simples de implementar.
Para entender, tienes que pensar en los números en binario.
Básicamente dice:
- para cero, use todos los 0.
- para enteros positivos, comience a contar, con un máximo de 2 (número de bits - 1) -1.
- para enteros negativos, haga exactamente lo mismo, pero cambie la función de 0 y 1 (así que en lugar de comenzar con 0000, comience con 1111, esa es la parte del "complemento").
Probémoslo con un mini-byte de 4 bits (lo llamaremos un mordisco - 1/2 byte).
0000
- cero
0001
- uno
0010
- dos
0011
- Tres
0100
a 0111
- cuatro a siete
Eso es lo más lejos que podemos llegar en positivo. 2 3 -1 = 7.
Para negativos:
1111
- uno negativo
1110
- negativo dos
1101
- negativo tres
1100
a 1000
- negativo cuatro a negativo ocho
Tenga en cuenta que obtiene un valor adicional para los negativos ( 1000
= -8) que no tiene para los positivos. Esto se debe a que 0000
se usa para cero. Esto se puede considerar como la línea numérica de computadoras
Distinguir entre números positivos y negativos.
Al hacer esto, el primer bit adquiere la función del bit de "signo", ya que puede usarse para distinguir entre valores decimales negativos y no negativos. Si el bit más significativo es 1
, entonces se puede decir que el binario es negativo, donde como si el bit más significativo (el más a la izquierda) es 0
, se puede decir que el valor decimal no es negativo.
Los números negativos del "complemento de uno" simplemente cambian el bit de signo, luego cuentan desde 0. Pero este enfoque tiene que lidiar con la interpretación 1000
como "cero negativo", lo cual es confuso. En general, solo tiene que preocuparse por esto cuando trabaja cerca del hardware.
Me pregunto si podría explicarse mejor que el artículo de Wikipedia.
El problema básico que está tratando de resolver con la representación del complemento a dos es el problema de almacenar enteros negativos.
Primero considere un entero sin signo almacenado en 4 bits. Puedes tener lo siguiente
Estos no están firmados porque no hay indicios de si son negativos o positivos.
Magnitud de signo y notación en exceso
Para almacenar números negativos, puede probar varias cosas. Primero, puede usar la notación de magnitud de signo que asigna el primer bit como bit de signo para representar +/- y los bits restantes para representar la magnitud. Entonces, usando 4 bits nuevamente y suponiendo que 1 significa - y 0 significa +, entonces tiene
Entonces, ¿ves el problema allí? Tenemos 0. positivo y negativo. El mayor problema es sumar y restar números binarios. Los circuitos para sumar y restar usando magnitud de signo serán muy complejos.
Que es
?
Otro sistema es el exceso de notación . Puede almacenar números negativos, deshacerse del problema de los dos ceros, pero la suma y la resta siguen siendo difíciles.
Entonces viene el complemento de dos. Ahora puede almacenar enteros positivos y negativos y realizar operaciones aritméticas con relativa facilidad. Hay varios métodos para convertir un número en el complemento de dos. Aquí hay uno.
Convertir decimal a complemento de dos
Convierta el número a binario (ignore el signo por ahora), por ejemplo, 5 es 0101 y -5 es 0101
Si el número es positivo, entonces ya está. por ejemplo, 5 es 0101 en binario usando dos notación de complemento.
Si el número es negativo, entonces
3.1 encontrar el complemento (invertir 0 y 1), por ejemplo, -5 es 0101, por lo que encontrar el complemento es 1010
3.2 Agregue 1 al complemento 1010 + 1 = 1011. Por lo tanto, -5 en el complemento a dos es 1011.
Entonces, ¿qué pasaría si quisieras hacer 2 + (-3) en binario? 2 + (-3) es -1. ¿Qué tendrías que hacer si estuvieras usando la magnitud del signo para sumar estos números? 0010 + 1101 =?
Usando el complemento de dos, considere lo fácil que sería.
Convertir el complemento de dos a decimal
Convertir 1111 a decimal:
El número comienza con 1, por lo que es negativo, por lo que encontramos el complemento de 1111, que es 0000.
Agregue 1 a 0000, y obtenemos 0001.
Convierta 0001 a decimal, que es 1.
Aplicar el signo = -1.
Tada!
fuente
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".
fuente
El complemento de 2 es muy útil para encontrar el valor de un binario, sin embargo, pensé en una forma mucho más concisa de resolver dicho problema (nunca he visto a nadie más publicarlo):
tome un binario, por ejemplo: 1101 que es [suponiendo que el espacio "1" es el signo] igual a -3 .
usando el complemento de 2 haríamos esto ... voltee 1101 a 0010 ... agregue 0001 + 0010 ===> nos da 0011. 0011 en binario positivo = 3. ¡por lo tanto 1101 = -3 !
Lo que me di cuenta:
en lugar de invertir y sumar, simplemente puede hacer el método básico para resolver un binario positivo (digamos 0101) es (2 3 * 0) + (2 2 * 1) + (2 1 * 0) + (2 0 * 1) = 5.
¡Haz exactamente el mismo concepto con un negativo! (Con un pequeño giro)
tome 1101, por ejemplo:
para el primer número en lugar de 2 3 * 1 = 8 , haga - (2 3 * 1) = -8 .
luego continúe como de costumbre, haciendo -8 + (2 2 * 1) + (2 1 * 0) + (2 0 * 1) = -3
fuente
Imagine que tiene un número finito de bits / trits / dígitos / lo que sea. Define 0 como todos los dígitos que son 0 y cuenta hacia arriba naturalmente:
Eventualmente se desbordará.
Tenemos dos dígitos y podemos representar todos los números del 0 al 100. ¡Todos esos números son positivos! ¿Y si también queremos representar números negativos?
Lo que realmente tenemos es un ciclo. El número anterior a 2 es 1. El número anterior a 1 es 0. El número anterior a 0 es ... 99 .
Entonces, por simplicidad, digamos que cualquier número superior a 50 es negativo. "0" a "49" representan 0 a 49. "99" es -1, "98" es -2, ... "50" es -50.
Esta representación es el complemento de diez . Las computadoras generalmente usan el complemento de dos , que es el mismo excepto que usan bits en lugar de dígitos.
Lo bueno del complemento de diez es que la suma simplemente funciona . ¡No necesita hacer nada especial para agregar números positivos y negativos!
fuente
Leí una explicación fantástica sobre Reddit por jng, usando el odómetro como analogía.
fuente
Se descubre dos complementos al sumar uno al primer complemento del número dado. Digamos que tenemos que encontrar dos complementos y
10101
luego encontrar sus complementos, es decir,01010
agregar1
a este resultado, es decir01010+1=01011
, que es la respuesta final.fuente
Vamos a obtener la respuesta 10 - 12 en forma binaria usando 8 bits: lo que realmente haremos es 10 + (-12)
Necesitamos obtener la parte de cumplido de 12 para restarlo de 10. 12 en binario es 00001100. 10 en binario es 00001010.
Para obtener la parte complementaria de 12, simplemente invertimos todos los bits y luego sumamos 1. 12 en binario invertido es 11110011. Este también es el código inverso (complemento de uno). Ahora necesitamos agregar uno, que ahora es 11110100.
¡Entonces 11110100 es el cumplido de 12! Fácil cuando lo piensas de esta manera.
Ahora puede resolver la pregunta anterior de 10-12 en forma binaria.
fuente
Complementos de 2: cuando agreguemos uno adicional con los complementos de 1 de un número, obtendremos los complementos de 2. Por ejemplo: 100101 es el complemento de 1 es 011010 y el complemento de 2 es 011010 + 1 = 011011 (Al agregar uno con el complemento de 1) Para obtener más información, este artículo lo explica gráficamente.
fuente
Mirar el sistema de complemento de los dos desde un punto de vista matemático realmente tiene sentido. En el complemento de diez, la idea es esencialmente 'aislar' la diferencia.
Ejemplo: 63-24 = x
Agregamos el complemento de 24 que es realmente justo (100 - 24). Entonces, realmente, todo lo que estamos haciendo es sumar 100 en ambos lados de la ecuación.
Ahora la ecuación es: 100 + 63 - 24 = x + 100, es por eso que eliminamos el 100 (o 10 o 1000 o lo que sea).
Debido a la situación inconveniente de tener que restar un número de una larga cadena de ceros, utilizamos un sistema de "complemento de radix disminuido", en el sistema decimal, complemento de nueve.
Cuando se nos presenta un número restado de una gran cadena de nueves, solo necesitamos revertir los números.
Ejemplo: 99999-03275 = 96724
Esa es la razón, después del complemento de nueve, agregamos 1. Como probablemente sepa de matemáticas de la infancia, 9 se convierte en 10 al 'robar' 1. Entonces, básicamente, es solo el complemento de diez lo que toma 1 de la diferencia.
En binario, el complemento de dos es equivalente al complemento de diez, mientras que el complemento de uno al complemento de nueve. La diferencia principal es que en lugar de tratar de aislar la diferencia con potencias de diez (sumando 10, 100, etc. en la ecuación) estamos tratando de aislar la diferencia con potencias de dos.
Es por esta razón que invertimos los bits. Al igual que nuestro minuendo es una cadena de nueves en decimal, nuestro minuendo es una cadena de unos en binario.
Ejemplo: 111111-101001 = 010110
Debido a que las cadenas de unos están 1 por debajo de un buen poder de dos, 'roban' 1 de la diferencia como lo hacen los nueve en decimal.
Cuando estamos usando números binarios negativos, en realidad solo estamos diciendo:
0000 - 0101 = x
1111 - 0101 = 1010
1111 + 0000 - 0101 = x + 1111
Para 'aislar' x, necesitamos agregar 1 porque 1111 está a uno de distancia de 10000 y eliminamos el 1 inicial porque lo agregamos a la diferencia original.
1111 + 1 + 0000 - 0101 = x + 1111 + 1
10000 + 0000 - 0101 = x + 10000
Simplemente quite 10000 de ambos lados para obtener x, es álgebra básica.
fuente
Muchas de las respuestas hasta ahora explican muy bien por qué el complemento de dos se usa para representar un número negativo, pero no nos dicen cuál es el número de complemento de dos, particularmente no por qué se agrega un '1', y de hecho a menudo se agrega de manera incorrecta.
La confusión proviene de una mala comprensión de la definición de un número de complemento. Un complemento es la parte que falta que haría algo completo.
El complemento de la raíz de un número de n dígitos x en la raíz b es, por definición, b ^ nx. En binario 4 está representado por 100, que tiene 3 dígitos (n = 3) y una raíz de 2 (b = 2). Entonces su complemento de radix es b ^ nx = 2 ^ 3-4 = 8-4 = 4 (o 100 en binario).
Sin embargo, en binario obtener un complemento de radix no es tan fácil como obtener su complemento de radix disminuido, que se define como (b ^ n-1) -y, solo 1 menos que el del complemento de radix. Para obtener un complemento de radix disminuido, simplemente voltea todos los dígitos.
100 -> 011 (complemento de radix disminuido (de uno))
Para obtener el complemento de radix (dos), simplemente agregamos 1, según la definición definida.
011 +1 -> 100 (complemento de dos).
Ahora con esta nueva comprensión, echemos un vistazo al ejemplo dado por Vincent Ramdhanie (ver la segunda respuesta anterior)
/ * inicio de Vincent
Convertir 1111 a decimal:
El número comienza con 1, por lo que es negativo, por lo que encontramos el complemento de 1111, que es 0000. Suma 1 a 0000 y obtenemos 0001. Convierta 0001 a decimal, que es 1. Aplique el signo = -1. Tada!
fin de Vincent * /
Debe entenderse como
El número comienza con 1, por lo que es negativo. Entonces sabemos que es un complemento de dos de algún valor x. Para encontrar la x representada por su complemento a dos, primero necesitamos encontrar su complemento a 1.
complemento de dos de x: 1111 complemento de uno de x: 1111-1 -> 1110; x = 0001, (voltear todos los dígitos)
aplique el signo -, y la respuesta = -x = -1.
fuente
La palabra complemento deriva de la integridad. En el mundo decimal, los números del 0 al 9 proporcionan un complemento (conjunto completo) de números o símbolos numéricos para expresar todos los números decimales. En el mundo binario, los números 0 y 1 proporcionan un complemento de números para expresar todos los números binarios. De hecho, los símbolos 0 y 1 deben usarse para representar todo (texto, imágenes, etc.) así como positivo (0) y negativo (1). En nuestro mundo, el espacio en blanco a la izquierda del número se considera cero:
En una ubicación de almacenamiento de computadora no hay espacio en blanco. Todos los bits (dígitos binarios) deben ser 0 o 1. Para usar eficientemente, los números de memoria pueden almacenarse como representaciones de 8, 16, 32, 64, 128 bits. Cuando un número que se almacena como un número de 8 bits se transfiere a una ubicación de 16 bits, el signo y la magnitud (valor absoluto) deben permanecer iguales. Tanto el complemento de 1 como las representaciones de complemento de 2 facilitan esto. Como sustantivo: tanto el complemento de 1 como el complemento de 2 son representaciones binarias de cantidades con signo donde el bit más significativo (el de la izquierda) es el bit de signo. 0 es para positivo y 1 es para negativo. Complemento 2s no significa negativo. Significa una cantidad firmada. Como en decimal, la magnitud se representa como la cantidad positiva. La estructura usa la extensión de signo para preservar la cantidad cuando se promociona a un registro [] con más bits:
Como verbo: complemento de 2 significa negar . No significa hacer negativo. Significa si negativo hace positivo; Si es positivo, haga negativo. La magnitud es el valor absoluto:
Esta capacidad permite una sustracción binaria eficiente usando negar y luego sumar. a - b = a + (-b)
La forma oficial de tomar el complemento del 1 es que cada dígito reste su valor a 1.
Esto es lo mismo que voltear o invertir cada bit individualmente. Esto da como resultado un cero negativo que no es muy querido, por lo que agregar uno al complemento de te 1 elimina el problema. Para negar o tomar el complemento 2s primero tome el complemento 1s y luego agregue 1.
En los ejemplos, la negación también funciona con signos de números extendidos.
Sumando:
1110 Carry 111110 Carry 0110 es lo mismo que 000110 1111 111111 sum 0101 sum 000101
Sustracción:
Tenga en cuenta que cuando se trabaja con el complemento de 2, el espacio en blanco a la izquierda del número se llena con ceros para números positivos, pero se llena con unos para números negativos. El carry siempre se agrega y debe ser 1 o 0.
Salud
fuente
El complemento de 2 es esencialmente una forma de encontrar el inverso aditivo de un número binario. Pregúntese esto: dado un número en forma binaria, ¿qué patrón de bits, cuando se agrega al número original, haría que el resultado sea cero? Si puede llegar a este patrón de bits, entonces ese patrón de bits es la representación -ve (inversa aditiva) del número original; como por definición, agregar un número a su inverso aditivo siempre debe resultar en cero. Ejemplo: tome 101, que es el decimal 5. Ahora la tarea es crear un patrón de bits que, cuando se agrega al patrón de bits dado (101), resultaría en cero. Para hacer eso, comience desde el bit más correcto de 101 y para cada bit individual, vuelva a hacer la misma pregunta: ¿Qué bit debo agregar a "este" bit para que el resultado sea cero? continúe haciendo eso teniendo en cuenta el arrastre habitual. Después de que hayamos terminado con los 3 lugares más a la derecha (los dígitos que definen el número original sin tener en cuenta los ceros a la izquierda), el último acarreo va en el patrón de bits del inverso aditivo. Además, dado que podríamos mantener el número original en un solo byte, todos los demás bits iniciales en el inverso aditivo también deberían ser 1 para que cuando la computadora agregue el número y su inverso aditivo usando "ese" tipo de almacenamiento (char) el resultado en ese carácter sería todos ceros.
fuente
Me gustó la respuesta de lavinio, pero los bits cambiantes agregan cierta complejidad. A menudo hay una opción de bits en movimiento respetando el bit de signo o sin respetar el bit de signo. Esta es la opción entre tratar los números con signo (-8 a 7 para un mordisco, -128 a 127 para bytes) o números sin signo de rango completo (0 a 15 para mordiscos, 0 a 255 para bytes).
fuente
Es un medio inteligente de codificar enteros negativos de tal manera que aproximadamente la mitad de la combinación de bits de un tipo de datos está reservada para enteros negativos, y la adición de la mayoría de los enteros negativos con sus correspondientes enteros positivos da como resultado un desbordamiento de arrastre eso deja el resultado como cero binario.
Entonces, en el complemento de 2 si uno es 0x0001, entonces -1 es 0x1111, porque eso dará como resultado una suma combinada de 0x0000 (con un desbordamiento de 1).
fuente
El complemento a dos es una de las formas de expresar un número negativo y la mayoría de los controladores y procesadores almacenan un número negativo en forma de complemento a 2
fuente
El complemento a dos se usa principalmente por las siguientes razones:
fuente
REFERENCIA: https://www.cs.cornell.edu/~tomf/notes/cps104/twoscomp.html
Invierto todos los bits y sumo 1. Programáticamente:
fuente
El complemento de 2 de un número dado es el no. se obtiene al agregar 1 con el complemento de 1 del no. supongamos que tenemos un número binario: 10111001101 Su complemento de 1 es: 01000110010 Y su complemento de 2 será: 01000110011
fuente
Complementar bit a bit un número es voltear todos los bits que contiene. Para complementarlo dos, volteamos todos los bits y agregamos uno.
Usando la representación de complemento de 2 para enteros con signo, aplicamos la operación de complemento de 2 para convertir un número positivo a su equivalente negativo y viceversa. Entonces, usando los nibbles como ejemplo,
0001
(1) se convierte en1111
(-1) y aplicando la operación nuevamente, regresa a0001
.El comportamiento de la operación en cero es ventajoso al proporcionar una representación única para cero sin un manejo especial de ceros positivos y negativos.
0000
complementa a1111
, que cuando se agrega 1. desborda a0000
, dándonos un cero, en lugar de uno positivo y uno negativo.Una ventaja clave de esta representación es que los circuitos de suma estándar para enteros sin signo producen resultados correctos cuando se les aplica. Por ejemplo, al agregar 1 y -1 en nibbles:
0001 + 1111
los bits se desbordan del registro y se quedan atrás0000
.Para una introducción amable, el maravilloso Computerphile ha producido un video sobre el tema .
fuente
En términos simples
2's Complement
es una forma de almacenar números negativos en la memoria de la computadora. Mientras que los números positivos se almacenan como número binario normal.Consideremos este ejemplo,
La computadora usa
Binary Number System
para representar cualquier número.Esto se representa como
0101
.Cuando la computadora se encuentra con el
-
signo, calcula el complemento de 2 y lo almacena.i.e
5 = 0101 y su complemento es 21011
.Las reglas importantes que usa la computadora para procesar números son,
1
entonces debe sernegative
número.0
un número positivo porque no hay un-0
sistema numérico (en1000 is not -0
cambio, es positivo8
)0
entonces lo es0
.positive number
.fuente
También puede usar una calculadora en línea para calcular la representación binaria del complemento a dos de un número decimal: http://www.convertforfree.com/twos-complement-calculator/
fuente
La respuesta más simple:
1111 + 1 = (1) 0000. Entonces 1111 debe ser -1. Entonces -1 + 1 = 0.
Es perfecto entender todo esto para mí.
fuente