¿Por qué preferir el complemento de dos sobre el signo y la magnitud para los números con signo?


201

Tengo curiosidad por saber si hay una razón por la cual para representar -1 en binario, se usa el complemento de dos: ¿voltear los bits y sumar 1?

-1 está representado por 11111111 (complemento de dos) en lugar de (para mí más intuitivo) 10000001, que es binario 1 con el primer bit como indicador negativo.

Descargo de responsabilidad: ¡No confío en la aritmética binaria para mi trabajo!


66
FWIW, su método "intuitivo" de usar un bit de signo se usa ocasionalmente, por ejemplo, la mayoría de las computadoras usan un bit de signo cuando representan números de punto flotante.
Adisak

2
@Adisak Se llama magnitud firmada
Cole Johnson

2
Siempre he asociado la representación de signo y magnitud con números enteros, ya que los números de coma flotante contienen tres componentes: un signo, un exponente y una mantisa (a menudo con un '1' implícito). Pero supongo que es bastante fácil tratar el exponente y la mantisa como magnitud siempre que uno se dé cuenta de que no son estrictamente lineales.
Adisak

Aquí hay un artículo que discute cómo los números de punto flotante se almacenan en binario, para aquellos que tienen curiosidad sobre los comentarios de @ Adisak.
GDP2

Acabo de ver un bonito video que explica esto youtube.com/watch?v=dHB7jFjESLY
allenlinli

Respuestas:


333

Se hace para que la suma no necesite tener una lógica especial para tratar con números negativos. Mira el artículo en Wikipedia .

Digamos que tienes dos números, 2 y -1. En su forma "intuitiva" de representar números, serían 0010y 1001, respectivamente (me quedo con 4 bits para el tamaño). En la forma del complemento de dos , son 0010y 1111. Ahora, digamos que quiero agregarlos.

La adición del complemento a dos es muy simple. Agrega números normalmente y cualquier bit de transporte al final se descarta. Entonces se agregan de la siguiente manera:

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

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

Pero en su método "intuitivo", agregar es más complicado:

  0010
+ 1001
= 1011

¿Cuál es -3, verdad? La adición simple no funciona en este caso. Debe tener en cuenta que uno de los números es negativo y usar un algoritmo diferente si ese es el caso.

Para este método de almacenamiento "intuitivo", la resta es una operación diferente a la suma, que requiere verificaciones adicionales en los números antes de que se puedan sumar. Dado que desea que las operaciones más básicas (suma, resta, etc.) sean lo más rápidas posible, debe almacenar los números de una manera que le permita utilizar los algoritmos más simples posibles.

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

0000  "zero"
1000  "negative zero"

Que son intuitivamente el mismo número pero tienen dos valores diferentes cuando se almacenan. Cada aplicación deberá tomar medidas adicionales para asegurarse de que los valores distintos de cero tampoco sean cero negativo.

Hay otra ventaja con el almacenamiento de entradas de esta manera, y ahí es cuando necesita extender el ancho del registro en el que se almacena el valor. Con el complemento de dos, almacenar un número de 4 bits en un registro de 8 bits es cuestión de repetir parte más significante:

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

Es solo una cuestión de mirar el bit de signo de la palabra más pequeña y repetirla hasta que cubra el ancho de la palabra más grande.

Con su método, necesitaría borrar el bit existente, que es una operación adicional además del relleno:

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

Aún necesita establecer esos 4 bits adicionales en ambos casos, pero en el caso "intuitivo" también necesita borrar el quinto bit. Es un pequeño paso adicional en una de las operaciones más fundamentales y comunes presentes en cada aplicación.


13
Estoy de acuerdo. El complemento a 2 funciona. Pero, ¿cómo llegamos a eso en primer lugar? Si supongo que necesito llegar a esta notación, cuál sería el proceso de pensamiento. Creo que llegar al complemento de 2 tiene que ser más que solo suerte, ¿no?
Lazer

1
Además, ¿por qué no hay una contraparte del complemento de 2 para flotadores?
Lazer

66
@Lazer revise este artículo para conocer how we arrived at 2s compliment the first place. cs.cornell.edu/~tomf/notes/cps104/twoscomp.html
Ankit

1
Java, solo que yo sepa, solo tiene tipos enteros con signo, por lo que siempre lo trata en la interpretación complementaria de sus dos. En otros idiomas, cómo se trata el valor depende de cómo lo trate el código. No hay nada que le diga que un bloque de memoria es un entero con signo o sin signo o un doble o una cadena u otra cosa. Los datos sin procesar son del tipo que elija para interpretarlos.
Welbog

3
@Suraj, sugiero que mire el artículo de Wikipedia sobre el complemento de dos para obtener la respuesta completa: en.wikipedia.org/wiki/Two%27s_complement . La respuesta corta es el MSB 1indica -8, y los restantes tres 1s indican 4, 2y 1, respectivamente, de modo -8+4+2+1 = -1.
Welbog

18

Wikipedia lo dice todo:

El sistema del complemento a dos tiene la ventaja de no requerir que los circuitos de suma y resta examinen los signos de los operandos para determinar si suman o restan. Esta propiedad hace que el sistema sea más sencillo de implementar y capaz de manejar fácilmente la aritmética de mayor precisión. Además, el cero tiene una sola representación, obviando las sutilezas asociadas con el cero negativo, que existe en los sistemas complementarios.

En otras palabras, sumar es el mismo, ya sea que el número sea negativo o no.


Señor, si escribo char a = 12; y unsigned char b = 12, es el patrón de bits subyacente igual, ¿qué sucede realmente?
Suraj Jain

Nada cambia cuando escribe o lee. Solo aplicable cuando suma o resta.
Talespin_Kit

12

Aunque esta pregunta es vieja, déjame poner mis 2 centavos.

Antes de explicar esto, volvamos a lo básico. El complemento 2 'es el complemento 1 + 1. Ahora, ¿qué es el complemento de 1 y cuál es su importancia además?

La suma de cualquier número de n bits y su complemento de 1 le da el número más alto posible que pueden representar 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, ¿qué pasará si intentamos agregar 1 más al resultado? Resultará en un desbordamiento.

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

Entonces ,

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)

Luego, alguien decidió llamar al complemento 1 + 1 como complemento 2 '. Entonces, la declaración anterior se convierte en: Cualquier número n'bit + su complemento de 2 = 0, lo que significa el complemento de 2 de un número = - (de ese número)

Todo esto produce una pregunta más, ¿por qué podemos usar solo el (n-1) de los n bits para representar un número positivo y por qué el bit más a la izquierda representa el signo (0 en el bit más a la izquierda significa + número de ve, y 1 significa -ve número). por ejemplo, ¿por qué usamos solo los primeros 31 bits de un int en java para representar un número positivo si el 32 ° bit 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 carry 1 desbordado)

Por lo tanto, el sistema de (n + 2'complemento de n) = 0, todavía funciona. La única ambigüedad aquí es el complemento de 2 de 12 es 0100, que también representa ambiguamente +8, además de representar -12 en el sistema de complemento de 2s.

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


1
+ 1'ed. Era información, sin embargo, al final, no estoy seguro de por qué querías tener el enfoque de bit más significativo para representar si es un número positivo o negativo. Tiene muchos problemas como 0 tendrá 2 representaciones: 0000 (+) y 1000 (-). Además, la suma y la resta no se pueden hacer usando el mismo algoritmo. Cuando dices un 0100 normal, entonces es +8 y cuando dices complemento de dos 0100, entonces es -12 ..
hagrawal 02 de

8

El complemento a dos permite que la suma y la resta se realicen de la manera normal (como se hace con números sin signo). También evita -0 (una forma separada de representar 0 que no sería igual a 0 con el método normal de comparación de bits por bit).


6

Esto es para simplificar sumas y diferencias de números. una suma de un número negativo y uno positivo codificados en los complementos de 2 es lo mismo que sumarlos de la manera normal.


5

La implementación habitual de la operación es "voltear los bits y sumar 1", pero hay otra forma de definirlo que probablemente aclare la lógica. El complemento de 2 es la forma que obtienes si tomas la representación sin signo habitual donde cada bit controla la siguiente potencia de 2, y solo haces que el término más significativo sea negativo.

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

La interpretación binaria sin signo habitual 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 = 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 cambia de significado en absoluto, y llevarlo a un 7 es "desbordamiento" y no se espera que funcione, por lo que casi todas las operaciones aritméticas funcionan sin modificación (como otros han señalado). La magnitud de signo generalmente inspecciona el bit de signo y usa una lógica diferente.


4

El complemento a dos permite sumar números negativos y positivos sin ninguna lógica especial.

Si intentó agregar 1 y -1 utilizando su método
10000001 (-1)
+00000001 (1)
obtendrá
10000010 (-2)

En cambio, al usar el complemento a dos, podemos agregar

11111111 (-1)
+00000001 (1) obtienes
00000000 (0)

Lo mismo es cierto para la resta.

Además, si intenta restar 4 de 6 (dos números positivos) puede complementar 2 de 4 y sumar los dos juntos 6 + (-4) = 6 - 4 = 2

Esto significa que la sustracción y la suma de los números positivos y negativos pueden realizarse mediante el mismo circuito en la CPU.


4

Para ampliar en otras respuestas:

En complemento a dos

  • La suma es el mismo mecanismo que la suma de enteros positivos simples.
  • Restar no cambia también
  • ¡Multiplicación también!

La división requiere un mecanismo diferente.

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


No es que solo la multiplicación no ensanchada sea la misma . Pero como la mayoría de los lenguajes de alto nivel no admiten la multiplicación de ampliación sin una conversión explícita, el resultado será el mismo en esos idiomas.
phuclv

@ LưuVĩnhPhúc: la multiplicación de ampliación generalmente será la misma, pero los resultados para la multiplicación con signo y sin signo solo se garantiza que sean los mismos si el resultado cabe en el rango de un int con signo. Algunos compiladores tienen gusto de gcc, dado algo como unsigned mul(unsigned short x, unsigned short y) { return x*y; }[16-bit corto; 32 bits int] ocasionalmente generará código que funcionará mal si el producto es mayor que 2147483647.
supercat

2

Al leer las respuestas a esta pregunta, me encontré con este comentario [editado].

El complemento de 2 de 0100 (4) será 1100. Ahora 1100 es 12 si digo normalmente. Entonces, cuando digo 1100 normal, entonces es 12, pero cuando digo el complemento 2 de 1100, entonces es -4. Además, en Java cuando 1100 (supongamos que 4 bits por ahora) se almacena, ¿cómo se determina si es +12 o -4? - hagrawal 2 de julio a las 16:53

En mi opinión, la pregunta que se hace en este comentario es bastante interesante, por lo que me gustaría, en primer lugar, reformularla y luego proporcionar una respuesta y un ejemplo.

PREGUNTA: ¿Cómo puede el sistema establecer cómo se deben interpretar uno o más bytes adyacentes? En particular, ¿cómo puede el sistema establecer si una secuencia dada de bytes es un número binario simple o un número de complemento a 2?

RESPUESTA: el sistema establece cómo interpretar una secuencia de bytes a través de los tipos. Los tipos definen

  • cuantos bytes hay que considerar
  • cómo deben interpretarse esos bytes

EJEMPLO: a continuación suponemos que

  • charson de 1 byte de largo
  • shortson de 2 bytes de largo
  • int'sy float' s tienen 4 bytes de longitud

Tenga en cuenta que estos tamaños son específicos de mi sistema. Aunque son bastante comunes, pueden ser diferentes de un sistema a otro. Si tiene curiosidad sobre cuáles son en su sistema, use el operador sizeof .

En primer lugar, definimos una matriz que contiene 4 bytes e inicializamos todos ellos al número binario 10111101, correspondiente al número hexadecimal BD.

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

Luego leemos el contenido de la matriz usando 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, intyfloat

// 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 en RAM ( l_Just4Bytes[ 0..3 ]) siempre permanecen exactamente iguales. Lo único que cambia es cómo los interpretamos.

Nuevamente, le decimos al sistema cómo interpretarlos a través de tipos .

Por ejemplo, arriba hemos usado los siguientes tipos para interpretar el contenido de la l_Just4Bytesmatriz

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

[EDITAR] Esta publicación ha sido editada después del comentario por el usuario4581301. ¡Gracias por tomarse el tiempo de dejar esas pocas líneas útiles!


Ese blob de código necesita una edición para que los lectores no tengan que seguir desplazándose de un lado a otro. Mejor, ese comentario masivo en la parte superior debería convertirse en texto antiguo y dejar que el procesador se encargue del formato. También debe agregar una advertencia al bit cerca del final donde discute los tamaños y el formato porque los tamaños no son fijos.
user4581301

+1. Una cosa que podría considerar hacer, @ mw215, es hacer que esta pregunta / respuesta empareje una entrada de Wiki de la comunidad por sí sola, porque es útil para las personas que podrían estar interesadas en la interpretación de bytes crudos fuera del contexto de las matemáticas complementarias de dos.
Welbog

Solo quiero saber si el complemento de 2 siempre sigue, es decir, si lo tengo int x = -4, y luego hago printf("%d" , x)¿cómo se interpreta? Además, ¿cuál es la diferencia entre unsigned inty signed inty %dy %u... esto me ha estado molestando durante mucho tiempo ahora. Gracias.
Suraj Jain

@Suraj Jain Cuando se usan inttipos, el signedmodificador es el predeterminado. Esto significa que inty signed intson exactamente del mismo tipo. Por lo tanto, las dos definiciones int i = -4;y signed int i = -4;tienen el mismo significado.
mw215

@Suraj Jain El sistema establece cómo interpretar una secuencia de bytes a través de tipos. Los tipos definen: cuántos bytes deben considerarse y cómo deben interpretarse esos bytes. Un intes de 4 bytes en el complemento de 2 y un de unsigned int4 bytes en notación binaria simple (verifique el tamaño de letra real en su sistema usando el sizeofoperador).
mw215

1

Puedes ver al profesor Jerry Cain de Stanford explicando el complemento de los dos, en la segunda conferencia (la explicación sobre el complemento de los 2 comienza alrededor de las 13:00) en la serie de conferencias llamadas Paradigmas de programación disponibles para ver desde el canal de YouTube de Standford. Aquí está el enlace a la serie de conferencias: http://www.youtube.com/view_play_list?p=9D558D49CA734A02 .


0

El complemento a dos se usa porque es más sencillo de implementar en los circuitos y tampoco permite un cero negativo.

Si hay x bits, el complemento de dos variará de + (2 ^ x / 2 + 1) a - (2 ^ x / 2). El complemento de uno se ejecutará desde + (2 ^ x / 2) hasta - (2 ^ x / 2), pero permitirá un cero negativo (0000 es igual a 1000 en un sistema de complemento de 1 bit de 4 bits).


0

Bueno, tu intención no es realmente invertir todos los bits de tu número binario. En realidad, es restar cada uno de sus dígitos de 1. Es una coincidencia afortunada que restar 1 de 1 da como resultado 0 y restar 0 de 1 da como resultado 1. Así que voltear bits está llevando a cabo esta resta de manera efectiva.

Pero, ¿por qué encuentras la diferencia de cada dígito de 1? Pues no lo eres. 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 solo 1. Por ejemplo, si su número es 10110001, cuando voltea todos esos bits, está calculando efectivamente (11111111 - 10110001).

Esto explica el primer paso en el cálculo del complemento de dos. Ahora incluyamos el segundo paso, agregar 1, también en la imagen.

Agregue 1 a la ecuación binaria anterior:

11111111 - 10110001 + 1

¿Qué sacas? Esta:

100000000 - 10110001

Esta es la ecuación final. Y al llevar a cabo esos dos pasos, está tratando de encontrar esta diferencia final: el número binario restado de otro número binario con un dígito adicional y que contiene ceros, excepto en la posición de bit más significativa.

Pero, ¿por qué anhelamos realmente esta diferencia? Bueno, de aquí en adelante, supongo que sería mejor si leyeras el artículo de Wikipedia .


0

Solo realizamos operaciones de suma para sumas y restas. Agregamos el segundo operando al primer operando para sumar. Para la resta, agregamos el complemento de 2 del segundo operando al primer operando.

Con una representación de complemento a 2 no necesitamos componentes digitales separados para la resta, solo se usan sumadores y complementos.


0

Vale la pena señalar que en algunas máquinas de sumar antes, antes de los días de las computadoras digitales, la sustracción se realizaría haciendo que el operador ingrese valores usando un conjunto de leyendas de diferentes colores en cada tecla (por lo que cada tecla ingresaría nueve menos el número restado), y presionar un botón especial supondría un acarreo en un cálculo. Por lo tanto, en una máquina de seis dígitos, para restar 1234 de un valor, el operador presionaría las teclas que normalmente indicarían "998,765" y presionaría un botón para agregar ese valor más uno al cálculo en progreso. La aritmética del complemento a dos es simplemente el equivalente binario de esa aritmética anterior del "complemento a diez".


0

La ventaja de realizar la resta por el método del complemento es la reducción de la
complejidad del hardware. No se necesitan los diferentes circuitos digitales para la suma y la resta. Tanto la suma como la resta se realizan solo por sumador.


0

Una ventaja importante de la representación del complemento a dos que aún no se ha mencionado aquí es que los bits más bajos de una suma, diferencia o producto del complemento a dos dependen solo de los bits correspondientes de los operandos. La razón por la que el valor con signo de 8 bits para -1 es 11111111que restando cualquier número entero cuyos 8 bits más bajos son 00000001de cualquier otro número entero cuyos 8 bits más bajos son 0000000, producirá un número entero cuyos 8 bits más bajos son11111111. Matemáticamente, el valor -1 sería una cadena infinita de 1, pero todos los valores dentro del rango de un tipo entero particular serán todos los 1 o todos los 0 más allá de cierto punto, por lo que es conveniente para las computadoras "extender-firmar" el bit más significativo de un número como si representara un número infinito de 1 o 0.

El complemento a dos es casi la única representación de números 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 la suma o la resta, el código puede obtener el fragmento más bajo de cada operando, calcular el fragmento más bajo de el resultado y almacénelo, luego cargue la siguiente porción de cada operando, calcule la siguiente porción del resultado y almacene eso, etc. puede manejar números con signo de 32 bits de manera razonablemente eficiente (más lento que con un registro de 32 bits, por supuesto, pero aún funciona).

Al usar cualquier otra representación firmada permitida por el Estándar C, cada bit del resultado podría verse afectado por cualquier bit de los operandos, por lo que es necesario mantener un valor completo en los registros a la vez o seguir los cálculos con un extra paso que, al menos en algunos casos, requeriría leer, modificar y reescribir cada parte del resultado.


Formatee su respuesta en el párrafo y marque el código como código, sería más fácil de leer y obtendrá un voto positivo.
Suraj Jain

@SurajJain: ¿Eso es mejor?
supercat

Sí, mejor de lo que era antes, quiero preguntarle una cosa cuál es la diferencia entre char a = 1 con signo y char a = 1 sin signo, cómo se representan en la memoria.
Suraj Jain

@SurajJain: en los sistemas de complemento a dos donde "char" es más pequeño que "int" [es decir, la gran mayoría de los sistemas], los tipos de caracteres con signo y sin signo se comportarán de manera idéntica, excepto que los tipos con signo se extenderán con signo cuando se lean y los tipos sin signo no lo haré En dicho sistema, el almacenamiento del valor 194 o -62 en un carácter con signo escribirá el mismo patrón de bits que el almacenamiento de 194 o -62 en un carácter sin signo (es decir, 11000010). La lectura de ese patrón de bits de un personaje firmado arrojará -62, y la lectura de un personaje sin signo producirá 194.
supercat

Signos extendidos significa?
Suraj Jain

0

Hay diferentes tipos de representaciones que son:

  1. representación de número sin signo
  2. representación con número firmado
  3. representación del complemento de uno
  4. Representación del complemento a dos

-Representación de números sin firmar utilizada para representar solo números positivos

-Representación de números firmados que se usa para representar números positivos y negativos. En la representación de número firmado, el bit MSB representa el bit de signo y el resto representa el número. Cuando MSB es 0 significa que el número es positivo y Cuando MSB es 1 significa que el número es negativo.

El problema con la representación de números firmados es que hay dos valores para 0.

El problema con la representación del complemento es que hay dos valores para 0.

Pero si usamos la representación del complemento a Dos, entonces solo habrá un valor para 0, por eso representamos números negativos en forma de complemento a dos.

Fuente: por qué los números negativos se almacenan en forma de complemento de dos bytesofgigabytes


-1

Una respuesta satisfactoria de por qué el Complemento de Two2 se usa para representar números negativos en lugar del sistema de Complemento de One es que el sistema de Complemento de Two resuelve el problema de las representaciones múltiples de 0 y la necesidad de llevar a cabo todo lo que existe en el sistema de complemento de One de representar negativo números.

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

Para End-around-carry, visite https://en.wikipedia.org/wiki/End-around_carry


en realidad, si tiene un punto decimal y es explícito acerca de lo que son todos los bits: "0..0000.1111..1" significa que todos los bits más a la izquierda no declarados son 0, y todos los bits más no a la derecha son 1, y por lo tanto el "..1" significa que se activa un carry. Por lo tanto, es (mecánicamente) "0.0001.0000..0". ¡Significa que "1..1111.1111..1" es igual a cero! Esto también significa que para negar un número entero, realmente solo voltea sus bits. Pero ahora se aplica a fracciones representables.
Rob
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.