Pregunta

Tengo curiosidad si hay una razón por la cual con el fin de representar a -1 en binario, se utiliza el complemento a dos:? Voltear los bits y la adición de 1

-1 está representado por 11.111.111 (complemento de dos) en lugar de (a mí más intuitivo) 10000001 que es binario 1 con primer bit marcar como negativo.

exención de responsabilidad: yo no se basan en la aritmética binaria para mi trabajo

¿Fue útil?

Solución

Ya está hecho de manera que además no necesita tener ninguna lógica especial para tratar con números negativos. Echa un vistazo a el artículo sobre Wikipedia .

Supongamos que tiene dos números, 2 y -1. En su camino "intuitiva" de representar números, serían 0010 y 1001, respectivamente (me quedo con 4 bits para el tamaño). En el complemento de dos vías, que son 0010 y 1111. Ahora, digamos que quiero añadir ellos.

Además de complemento a dos es muy simple. Añade números normalmente y se descarta cualquier bit de acarreo al final. Así que están añaden los siguientes:

  0010
+ 1111
=10001
= 0001 (discard the carry)

0001 es 1, que es el resultado esperado de "2 + (- 1)".

Sin embargo, en el método de "intuitiva", añadiendo es más complicado:

  0010
+ 1001
= 1011

Lo que es -3, ¿verdad? Además sencilla no funciona en este caso. Es necesario tener en cuenta que uno de los números es negativo y el uso de un algoritmo diferente si ese es el caso.

En este método de almacenamiento "intuitiva", la resta es una operación diferente de adición, lo que requiere comprobaciones adicionales sobre el número antes de que puedan ser añadidos. Puesto que desea que las operaciones más básicas (suma, resta, etc.) a ser tan rápido como sea posible, es necesario almacenar los números de una manera que le permite utilizar los algoritmos más simples posible.

Además, en el método de almacenamiento "intuitiva", hay dos ceros:

0000  "zero"
1000  "negative zero"

¿Cuáles son intuitivamente el mismo número, pero tener dos valores diferentes cuando se almacena. Cada aplicación tendrá que tomar medidas adicionales para asegurarse de que los valores no nulos tampoco son cero negativo.

Hay otro bono con el almacenamiento de enteros de esta manera, y eso es cuando se necesita para extender el ancho de la registrar el valor está siendo almacenada en. Con el complemento a dos, se almacena un número de 4 bits en un registro de 8 bits es una cuestión de repetir su bit más significativo:

    0001 (one, in four bits)
00000001 (one, in eight bits)
    1110 (negative two, in four bits)
11111110 (negative two, in eight bits)

Es sólo una cuestión de mirar el bit de signo de la palabra más pequeño y repetir hasta que se rellena el ancho de la palabra más grande.

Con el método que se necesita para borrar el bit existente, que es una operación adicional además de padding:

    0001 (one, in four bits)
00000001 (one, in eight bits)
    1010 (negative two, in four bits)
10000010 (negative two, in eight bits)

Todavía es necesario establecer esos 4 bits adicionales en ambos casos, pero en el caso "intuitiva" es necesario borrar el quinto bits también. Es un pequeño paso adicional en una de las operaciones más fundamentales y comunes presentes en todas las aplicaciones.

Otros consejos

Wikipedia lo dice todo:

  

El sistema de complemento a dos tiene la ventaja de que no requiere que el circuito de suma y resta examinar las señales de los operandos para determinar si sumar o restar. Esta propiedad hace que el sistema, tanto más sencillo de implementar y capaz de manejar fácilmente más alta precisión aritmética. Además, cero tiene sólo una única representación, obviando las sutilezas asociados con cero negativo, que existe en los sistemas de ones'-complemento.

En otras palabras, la adición es el mismo, tiempo o no el número es negativo.

A pesar de que esta pregunta es viejo, que me pongo en mis 2 centavos.

Antes de explicar esto, volvamos a lo básico. 2' del complemento es de complemento a 1 + 1. Ahora, ¿qué es de 1 complemento y cuál es su importancia en la adición.

La suma de cualquier número de n bits y el complemento de la 1 le da el mayor número posible de que pueden ser representados por esos n bits. Ejemplo:

 0010 (2 in 4 bit system)
+1101 (1's complement of 2)
___________________________
 1111  (the highest number that we can represent by 4 bits)

Ahora lo que sucederá si tratamos de añadir 1 más que el resultado. Será resultados en un desbordamiento.

El resultado se 1 0000 que es 0 (ya que estamos trabajando con los números de 4 bits, (la 1 a la izquierda es un desbordamiento)

Por lo tanto,

Any n-bit number + its 1's complement = max n-bit number
Any n-bit number + its 1'complement + 1 = 0 ( as explained above, overflow will occur as we are adding 1 to max n-bit number)

Alguien decidió entonces llamar de complemento a 1 + 1 como 2'complement. Por lo que la afirmación anterior se convierte en: Cualquier número n'bit + su complemento a 2 = 0 lo que significa de 2 complemento de un número = - (de ese número)

Todo esto produce una última pregunta, ¿por qué podemos utilizar solamente el (n-1) de los n bits para representar números positivos y por qué el enésimo bit más a la izquierda representan signo (0 sobre los medios más a la izquierda bits + ve el número, y 1 significa número -ve). por ejemplo, ¿por qué Nosotros usamos sólo los primeros 31 bits de una int en Java para representar número positivo si el bit 32a es 1, es un número -ve.

 1100 (lets assume 12 in 4 bit system)
+0100(2's complement of 12)
___________________________

1 0000 (el resultado es cero, con el desbordamiento carry 1)

Así, el sistema de (n + 2'complement de n) = 0, todavía funciona. La única ambigüedad aquí es complemento de 12 de 2 es 0100 que ambiguamente también representa 8, excepto que representa -12 en el sistema de complemento a 2.

Este problema será resuelto si los números positivos siempre tienen un 0 en su bit más a la izquierda. En tal caso, su complemento a 2 siempre tendrá un 1 en su bit más a la izquierda, y que no tendrá la ambigüedad del mismo conjunto de bits que representan un número complementario del 2, así como un número + ve.

Complemento a dos permite a la suma y resta por hacer de la forma habitual (como usted herida para números sin signo). También evita -0 (una manera separada para representar 0 que no sería igual a 0 con el método normal bit por bit de la comparación de números).

este es simplificar sumas y diferencias de números. una suma de un número negativo y uno positivo codificado en complementos de 2 es la misma que sumarlos de la forma habitual.

La aplicación habitual de la operación es "voltear los bits y añadir 1", pero no hay otra manera de definir lo que probablemente hace que la justificación más clara. complemento a 2 es la forma que se obtiene si se toma la representación sin signo habitual que cada bit controla la siguiente potencia de 2, y acaba de hacer el término más significativo negativo.

Tomando un valor de 8 bits a 7 a 6 a 5 a 4 a 3 a 2 a 1 a 0

La interpretación binario sin signo habitual es:
2 7 * a 7 + 2 6 * a 6 + 2 5 * un 5 + 2 4 * a 4 + 2 3 * a 3 + 2 2 * a 2 + 2 1 * a 1 + 2 0 * un 0
11111111 = 128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = 255

La interpretación del complemento a dos es:
-2 7 * a 7 + 2 6 * a 6 + 2 5 * a 5 + 2 4 * a 4 + 2 3 * a 3 + 2 2 * a 2 + 2 1 * a 1 + 2 0 * a 0
11111111 = -128 + 64 + 32 + 16 + 8 + 4 + 2 + 1 = -1

Ninguno de los otros bits cambian de significado en absoluto, y que lleva en un 7 es "desbordamiento" y no se espera que trabajar, así que prácticamente todas las operaciones aritméticas trabajar sin modificaciones (como otros tienen célebre). Muestra de magnitud generalmente inspeccionar el bit de signo y el uso de la lógica diferente.

Complemento a dos permite que los números negativos y positivos que se añaden juntos sin ninguna lógica especial.

Si ha intentado añadir al menos 1 y -1 utilizando el método de
 10000001 (-1)
+00000001 (1)
se obtiene
 10000010 (-2)

En su lugar, mediante el uso de complemento a dos, podemos añadir

11111111 (-1)
+00000001 (1) se obtiene
 00000000 (0)

Lo mismo es cierto para la substracción.

Además, si se intenta restar 4 de 6 (dos números positivos) puede complemento a 2 4 y añadir los dos juntos 6 + (-4) = 6 - 4 = 2

Esto significa que la sustracción y la adición de dos números positivos y negativos pueden ser realizadas por el mismo circuito en la CPU.

Para ampliar otras respuestas:

En complemento a dos

  • Adición es el mismo mecanismo que los números enteros positivos de fricción adición.
  • Restando no cambia demasiado
  • La multiplicación también!

División requiere un mecanismo diferente.

Todo esto es cierto, porque el complemento a dos es simplemente normal aritmética modular, donde elegimos a mirar algunos números como negativo restando el módulo.

La lectura de las respuestas a esta pregunta, me encontré con este comentario [Editado].

  complemento de 0100

de 2 (4) será 1100. Ahora 1100 es 12 si digo normalmente. Entonces,   cuando digo normal de 1100, entonces es 12, pero cuando digo complemento a 2, entonces 1100   es -4? También, en Java cuando 1100 (supongamos 4 bits para ahora) se almacena entonces   ¿Cómo se determina si es 12 o -4 ?? - hagrawal Jul 2 Cuando 16:53

En mi opinión, la pregunta planteada en este comentario es muy interesante y por eso me gustaría en primer lugar a reformular y después de dar una respuesta y un ejemplo.

PREGUNTA - ¿Cómo se puede establecer el sistema de cómo se tienen que interpretar uno o más bytes adyacentes? En particular, ¿cómo puede el sistema de establecer si una determinada secuencia de bytes es un número binario sin formato o un número complementario del 2?

RESPUESTA - El sistema establece cómo interpretar una secuencia de bytes a través tipos. Tipos definen

  • cuantos bytes tienen que ser considerados
  • como estos bytes deben ser interpretados

Ejemplo - A continuación se supone que

  • de char son de 1 byte
  • short de 2 bytes de longitud
  • int y de los años float son 4 bytes de longitud

Tenga en cuenta que estos tamaños son específicos de mi sistema. Aunque es bastante común, que puede ser diferente de un sistema a otro. Si tienes curiosidad de lo que son en su sistema, utilice el operador sizeof .

Primero de todo, definir una matriz que contiene 4 bytes e inicializar todos ellos a la 10111101 número binario, que corresponde a la BD número hexadecimal.

// BD(hexadecimal) = 10111101 (binary)
unsigned char   l_Just4Bytes[ 4 ]   =   { 0xBD, 0xBD, 0xBD, 0xBD };

A continuación, se lee el contenido de matrices con diferentes tipos.

unsigned char y signed char

// 10111101 as a PLAIN BINARY number equals 189
printf( "l_Just4Bytes as unsigned char  -> %hi\n", *( ( unsigned char* )l_Just4Bytes ) );

// 10111101 as a 2'S COMPLEMENT number equals -67
printf( "l_Just4Bytes as signed char    -> %i\n", *( ( signed char* )l_Just4Bytes ) );

unsigned short y short

// 1011110110111101 as a PLAIN BINARY number equals 48573
printf( "l_Just4Bytes as unsigned short -> %hu\n", *( ( unsigned short* )l_Just4Bytes ) );

// 1011110110111101 as a 2'S COMPLEMENT number equals -16963
printf( "l_Just4Bytes as short          -> %hi\n", *( ( short* )l_Just4Bytes ) );

unsigned int, int y float

// 10111101101111011011110110111101 as a PLAIN BINARY number equals 3183328701
printf( "l_Just4Bytes as unsigned int   -> %u\n", *( ( unsigned int* )l_Just4Bytes ) );

// 10111101101111011011110110111101 as a 2'S COMPLEMENT number equals -1111638595
printf( "l_Just4Bytes as int            -> %i\n", *( ( int* )l_Just4Bytes ) );

// 10111101101111011011110110111101 as a IEEE 754 SINGLE-PRECISION number equals -0.092647
printf( "l_Just4Bytes as float          -> %f\n", *( ( float* )l_Just4Bytes ) );

Los 4 bytes de memoria RAM (l_Just4Bytes[ 0..3 ]) permanecen siempre exactamente lo mismo. Lo único que cambia es la forma en que los interpretamos.

Una vez más, que indicar al sistema ¿Cómo para interpretarlas a través de tipo .

Por ejemplo, anteriormente se han utilizado los siguientes tipos de interpretar los contenidos de la matriz l_Just4Bytes

  • unsigned char: 1 byte en binario sin formato
  • signed char: 1 byte en complemento a 2
  • unsigned short: 2 bytes en notación binaria llanura
  • short: 2 bytes en complemento a 2
  • unsigned int: 4 bytes en notación binaria llanura
  • int: 4 bytes en complemento a 2
  • float: 4 bytes en IEEE 754 notación de precisión simple

[EDIT] Esta respuesta ha sido editada después del comentario de user4581301. Gracias por tomarse el tiempo para caer esas pocas líneas votos!

Usted puede ver el profesor Jerry Caín de Stanford explicar el complemento a dos, en la segunda conferencia (la explicación con respecto a la dotación del 2 comienza alrededor de las 13:00) en el ciclo de conferencias llamados paradigmas de programación disponibles para ver desde el canal YouTube de Standford. Aquí está el enlace a la serie de conferencias: http://www.youtube.com/view_play_list?p= 9D558D49CA734A02 .

complemento

Dos de se utiliza porque es más fácil de implementar en circuitos y también no permitir que un cero negativo.

Si hay x bits, en complemento a dos oscilará entre + (2 ^ x / 2 + 1) a - (2 ^ x / 2). Uno de complemento se extenderá desde + (2 ^ x / 2) a -. (2 ^ x / 2), pero permitirá que un cero negativo (0000 es igual a 1000 en sistema del complemento un 4 bit de 1)

Bueno, su intención no es realmente de invertir todos los bits de su número binario. En realidad, es para restar cada uno su dígito de 1. Es sólo una coincidencia afortunada que restando 1 de 1 resultados en 0 y restando 0 de 1 resultados en trozos 1. Así que mover de un tirón está llevando a cabo con eficacia esta sustracción.

Pero por qué están encontrando diferencias de cada dígito del 1? Bueno, no es así. Su intención real es calcular la diferencia del número binario dado de otro número binario que tiene el mismo número de dígitos, pero contiene sólo 1 de. Por ejemplo si su número es 10110001, cuando se le da la vuelta todos esos bits, que estés calcular de manera efectiva. (11111111 - 10110001)

Esto explica el primer paso en el cálculo del complemento a dos. Ahora vamos a incluir el segundo paso - la adición de 1 -. También en la imagen

Añadir 1 a la ecuación binario arriba:

11111111 - 10110001 + 1

¿Qué se obtiene? Este:

100000000 - 10110001

Esta es la ecuación final. Y la realización de esos dos pasos que está tratando de encontrar esto, diferencia final:. El número binario restado de otro número binario con un dígito extra y ceros que contienen excepto en la posición de bit más significación

Pero ¿por qué estamos hankerin después de esta diferencia realmente? Pues bien, a partir de aquí, supongo que sería mejor si se lee el rel="nofollow artículo de Wikipedia .

Realizamos única operación de adición tanto para la suma y la resta. Añadimos el segundo operando para el primer operando para la adición. Para la sustracción añadimos complemento del segundo operando del 2 al primer operando.

Con la representación de complemento a 2, no necesitamos componentes digitales separadas para sumadores y empresas complementarias resta sólo se utilizan.

Vale la pena señalar que en algunas máquinas de sumar los primeros, antes de que los días de las computadoras digitales, se llevaría a cabo la sustracción por tener el operador introducir valores utilizando un conjunto diferente color de leyendas en cada tecla (por lo que cada tecla entraría nueve menos el número que se restará), y pulsar un botón especial que asumiría un acarreo dentro de un cálculo. Por lo tanto, en una máquina de seis dígitos, para restar un valor de 1.234, el operador golpearía teclas que normalmente indicar "998765" y pulsa un botón para añadir que el valor más uno para el cálculo en curso. Dos de aritmética de complemento es simplemente el equivalente binario de que la aritmética anterior "ten's-complemento".

La ventaja de realizar la sustracción por el método del complemento es la reducción en el hardware
complexity.The hay necesidad de los diferentes circuitos digitales para la adición y subtraction.both  la suma y resta sólo los realiza sumador.

Una ventaja principal de la representación en complemento a dos que aún no se ha mencionado aquí es que los bits inferiores de una suma en complemento a dos, la diferencia, o producto dependen solamente sobre los bits correspondientes de los operandos. La razón de que el valor con signo de 8 bits para -1 es 11111111 es que restando cualquier número entero cuyo más baja 8 bits se 00000001 de cualquier otro número entero cuyo más bajo 8 bits son 0000000 rendirá un número entero cuyo más baja 8 bits son 11111111. Matemáticamente, el valor -1 sería una cadena infinita de 1 de, pero todos los valores dentro del rango de un tipo entero particular o bien ser todo 1 de o los 0 de pasado un cierto punto, por lo que es conveniente para los ordenadores para "signo-extender" la bit más significativo de un número como si representaba un número infinito de 1 ó 0 de de.

en complemento a dos es casi la única representación en número con signo que funciona bien cuando se trata de tipos más grandes que el tamaño de palabra natural de una máquina binaria, ya que al realizar sumas o restas, código puede buscar el trozo más bajo de cada operando, calcular el más bajo trozo del resultado, y tienda que, a continuación, cargar el siguiente trozo de cada operando, calcular el siguiente fragmento del resultado, y tienda que, etc. por lo tanto, incluso un procesador que requiere que todas las adiciones y sustracciones a ir a través de un único 8 registro de bits puede manejar números con signo de 32 bits con una eficiencia razonable (más lenta que con un registro de 32 bits, por supuesto, pero aún viable).

Cuando se utiliza de las otras representaciones firmados permitidos por la Norma C, cada bit del resultado podría ser potencialmente afectada por ninguna de bits de los operandos, por lo que es necesario o bien mantener un valor entero en registros a la vez o de lo contrario seguir cálculos con un paso adicional que, al menos en algunos casos, requieren la lectura, modificar y volver a escribir cada trozo del resultado.

Una respuesta satisfactoria de por qué Complemento de dos2 se utiliza para representar números negativos en lugar de sistema de complemento Una es que                         sistema de complemento a dos resuelve el problema de múltiples representaciones de 0 y la necesidad de end-around-llevar que existe en el sistema de complemento a uno de representar números negativos.

Para más información Visita https://en.wikipedia.org/wiki/Signed_number_representations

Para End-around-llevar Visita https://en.wikipedia.org/wiki/End-around_carry

ya que los fabricantes de CPU son perezosos!

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top