¿Qué es el "Complemento de 2"?


434

Estoy en un curso de sistemas informáticos y he estado luchando , en parte, con Two's Complement . Quiero entenderlo, pero todo lo que he leído no me ha unido la imagen. He leído el artículo de Wikipedia y varios otros artículos, incluido mi libro de texto .

Por lo tanto, quería comenzar esta publicación en la wiki de la comunidad para definir qué es Complemento de dos, cómo usarlo y cómo puede afectar los números durante operaciones como conversiones (de firmado a no firmado y viceversa), operaciones a nivel de bit y operaciones de cambio de bit .

Lo que espero es una definición clara y concisa que sea fácilmente entendida por un programador.

Respuestas:


628

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
  • 0100a 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
  • 1100a 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 0000se 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 1000como "cero negativo", lo cual es confuso. En general, solo tiene que preocuparse por esto cuando trabaja cerca del hardware.


148
Probablemente la mejor parte del complemento de dos es cómo simplifica las matemáticas. Intente agregar 2 (0010) y -2 (1110) juntos y obtendrá 10000. El bit más significativo es el desbordamiento, por lo que el resultado es en realidad 0000. Casi como magia, 2 + -2 = 0.
Naaff

96
Otra ventaja además de la fácil suma y resta es que el complemento 2 solo tiene un cero. Si estuviera usando un bit de signo simple, digamos que usando 0001 para representar +1 y 1001 para representar -1, tendría dos ceros: 0000 ("+0") y 1000 ("-0"). Eso es un verdadero dolor en la parte de atrás.
Jörg W Mittag

26
Vota a favor de que sea ir al grano y también de explicar por qué los valores negativos tienen un rango mayor que los positivos. Vine buscando la razón de la diferencia de rango.
Ashwin

2
¿No deberías decir "para enteros negativos, haz exactamente lo mismo pero cuenta atrás y cambia el rol de 0 y 1"
Koray Tugay

1
Impresionante. Se agregaron partes adicionales de conversión de bits a entero negativo.
Suraj Jain

340

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

0000 = 0
0001 = 1
0010 = 2
...
1111 = 15

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

0000 = +0
0001 = +1
0010 = +2
...
1000 = -0
1001 = -1
1111 = -7

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

0010
1001 +
----

?

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

  1. Convierta el número a binario (ignore el signo por ahora), por ejemplo, 5 es 0101 y -5 es 0101

  2. Si el número es positivo, entonces ya está. por ejemplo, 5 es 0101 en binario usando dos notación de complemento.

  3. 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.

 2  =  0010
 -3 =  1101 +
 -------------
 -1 =  1111

Convertir el complemento de dos a decimal

Convertir 1111 a decimal:

  1. El número comienza con 1, por lo que es negativo, por lo que encontramos el complemento de 1111, que es 0000.

  2. Agregue 1 a 0000, y obtenemos 0001.

  3. Convierta 0001 a decimal, que es 1.

  4. Aplicar el signo = -1.

Tada!


45
La mejor respuesta en mi opinión.
Koray Tugay

55
sí, este es bastante simple y explica muy bien el asunto
Max Koretskyi

3
No entiendo cómo agregar uno al convertir ambas formas siempre conduce al mismo número. En mi opinión, invertirías los pasos o restarías uno o algo.
Marcos Pereira

2
¿Por qué agregar 1 al complemento?
Zinan Xing

44
Esta respuesta debe usarse en Wikipedia.
Hiroki

119

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".


1
Me gusta esta respuesta! Explica cómo tomar 2s complementa y agregar uno funciona.
SJ.

Me gusta esta respuesta también. Especialmente donde muestra cómo se calcula el número negativo. Aquí pensé que todo el número estaba invertido, no solo el MSB y luego volví a agregar los otros valores ponderados. Gracias, esto resolvió mi bloqueo cerebral
user188757

Buen trabajo mencionando el número impar que no tiene un inverso. ¿Pero qué hacemos al respecto? ¿Acabamos de configurar el indicador de desbordamiento si alguien intenta invertirlo?
NH.

Mientras que otras respuestas se centran en el "cómo", esta respuesta nos lleva suavemente con el "por qué". Me ayudó. ¡Gracias!
Abhishek Pathak

Si un número termina con 11000 ... 000, invertirlo producirá 01000 ... 000. La notación de complemento a dos se basa en la idea de que todos los dígitos a la izquierda del dígito representado más a la izquierda deben tener el mismo valor que ese dígito, pero al invertir un número cuya representación es 1000 ... 000, eso no será cierto.
supercat

20

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


1
La mejor manera, pude entender el complemento de 2. Después de leer esto, pude entender todas las respuestas a la pregunta anterior.
Shakeel Shahzad

1
Este método se menciona en el libro Sistemas informáticos: la perspectiva de un programador.
jimo

1
¡Esta es una forma mucho más rápida!
chanzerre

14

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:

00
01
02
..

Eventualmente se desbordará.

98
99
00

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!


9

Leí una explicación fantástica sobre Reddit por jng, usando el odómetro como analogía.

ingrese la descripción de la imagen aquí

Es una convención útil. Los mismos circuitos y operaciones lógicas que suman / restan números positivos en binario aún funcionan en números positivos y negativos si se usa la convención, por eso es tan útil y omnipresente.

Imagine el cuentakilómetros de un automóvil, gira alrededor de (digamos) 99999. Si incrementa 00000, obtiene 00001. Si disminuye 00000, obtiene 99999 (debido al desplazamiento). Si agrega uno de nuevo a 99999, vuelve a 00000. Por lo tanto, es útil decidir que 99999 representa -1. Del mismo modo, es muy útil decidir que 99998 representa -2, y así sucesivamente. Debe detenerse en algún lugar, y también por convención, la mitad superior de los números se consideran negativos (50000-99999), y la mitad inferior positiva solo se destacan (00000-49999). Como resultado, el dígito superior que es 5-9 significa que el número representado es negativo, y que es 0-4 significa que el representado es positivo, exactamente lo mismo que el bit superior que representa el signo en el número binario del complemento a dos.

Entender esto también fue difícil para mí. Una vez que lo obtuve y volví a volver a leer los artículos y las explicaciones de los libros (en ese entonces no había Internet), resultó que muchos de los que lo describieron realmente no lo entendieron. Escribí un libro enseñando lenguaje ensamblador después de eso (que se vendió bastante bien durante 10 años).


5

Se descubre dos complementos al sumar uno al primer complemento del número dado. Digamos que tenemos que encontrar dos complementos y 10101luego encontrar sus complementos, es decir, 01010agregar 1a este resultado, es decir 01010+1=01011, que es la respuesta final.


4

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.

00001010
11110100
-----------------
11111110  

3

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.


plus1 para el enlace que tiene una explicación con círculo
Manohar Reddy Poreddy

3

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.


3

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.


3

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:

                  35=035=000000035.

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:

       [0101]=[00101]=[00000000000101]=5 (base 10)
       [1011]=[11011]=[11111111111011]=-5(base 10)

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:

        if a >= 0 then |a| = a
        if a < 0 then |a| = -a = 2scomplement of a

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.

        1'scomp(0101) = 1010.

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.

        Example 1                             Example 2
         0101  --original number              1101
         1's comp  1010                       0010
         add 1     0001                       0001
         2's comp  1011  --negated number     0011

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:

    1110  Carry                      00000   Carry
     0110          is the same as     00110
    -0111                            +11001
  ----------                        ----------
sum  0101                       sum   11111

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


3

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.

 1 1 1
 ----------
   1 0 1
 1 0 1 1 ---> additive inverse
  ---------
   0 0 0

2

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).


2

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).


1

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


1
Esto no agrega nada a la información proporcionada por otras respuestas.
Adrian Mole

1

El complemento a dos se usa principalmente por las siguientes razones:

  1. Para evitar múltiples representaciones de 0
  2. Para evitar realizar un seguimiento del bit de acarreo (como en el complemento de uno) en caso de desbordamiento.
  3. Llevar a cabo operaciones simples como sumar y restar se vuelve fácil.

0

REFERENCIA: https://www.cs.cornell.edu/~tomf/notes/cps104/twoscomp.html

Invierto todos los bits y sumo 1. Programáticamente:

  // in C++11
  int _powers[] = {
      1,
      2,
      4,
      8,
      16,
      32,
      64,
      128
  };

  int value=3;
  int n_bits=4;
  int twos_complement = (value ^ ( _powers[n_bits]-1)) + 1;

Incluso el ensamblador tendría un nivel demasiado alto. Necesita ver un esquema de nivel de puerta de lógica de adición. Con T ciclos. Eres algorítmicamente correcto.
mckenzm

0

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


0

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 en 1111(-1) y aplicando la operación nuevamente, regresa a 0001.

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. 0000complementa a 1111, que cuando se agrega 1. desborda a 0000, 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 + 1111los bits se desbordan del registro y se quedan atrás 0000.

Para una introducción amable, el maravilloso Computerphile ha producido un video sobre el tema .


0

En términos simples 2's Complementes 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 Systempara representar cualquier número.

x = 5;

Esto se representa como 0101.

x = -5;

Cuando la computadora se encuentra con el -signo, calcula el complemento de 2 y lo almacena. i.e5 = 0101 y su complemento es 2 1011.

Las reglas importantes que usa la computadora para procesar números son,

  1. Si el primer bit es, 1entonces debe ser negativenúmero.
  2. Si todos los bits, excepto el primer bit, son 0un número positivo porque no hay un -0sistema numérico (en 1000 is not -0cambio, es positivo 8)
  3. Si todos los bits son, 0entonces lo es 0.
  4. De lo contrario es a positive number.


-6

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í.


Esto no proporciona una respuesta a la pregunta. Para criticar o solicitar una aclaración de un autor, deje un comentario debajo de su publicación.
Codor

Es la respuesta. Lo más simple. Para mí, el mejor.
Dmitry
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.