¿Cómo maneja una computadora la resta de 2 valores que están en complemento de dos?

0

Estoy confundido sobre cómo calcula la computadora si hay dos valores A y B , ambos están en el complemento de dos. Ahora queremos hacer la operación D=A-B . ¿Cómo se hace esto?

Digamos que A=0100110 y B=0000111

¿Qué hacemos ahora?

Lo haría: 0100110+0000111 pero realmente no estoy seguro.

O tal vez: 0100110+1111000 ? Así que básicamente A+NegationOfB

¿Alguna idea? Por favor, hágamelo saber ya que esto es muy confuso para mí ...

Editar : jonk Hice una tabla para tu respuesta, pero no sé cómo hacer visible en la tabla que tenemos cin0 = 1 porque tenemos una resta ... ¿sabes? ¿Es la tabla correcta para su descripción?

    
pregunta klbrtree

4 respuestas

2

En el complemento de dos, la negación de un número es lo mismo que invertir todos los bits y luego agregar uno. Entonces, para anular '0100110' simplemente invierta los bits a '1011001' y luego agregue '1', dando '1011010'. Eso es todo lo que hay en la negación. (Creo que sabes que \ $ \ overline {1} = 0 \ $ y \ $ \ overline {0} = 1 \ $, ¿sí?)

Una vez que sepa cómo negar un valor, es fácil restar B de A. Solo tiene que negar B y luego agregarlo a A. Así que la mayoría de las computadoras no incluyen un grupo separado de lógica para la resta (lo que tomaría espacio y cuesta dinero) pero solo mantén la misma capacidad de AGREGAR.

Necesitas saber una cosa más. Cómo funciona un sumador básico de ondulación. Este tipo de sumador está formado por un grupo de sumadores de un bit encadenados entre sí. Cada sumador de un bit acepta un bit de A, un bit similar de B y un arrastre que viene de la transferencia del sumador de un bit de siguiente orden inferior. Cada sumador de un bit proporciona una suma de un bit y un arrastre. Entonces hay tres bits en el sumador (\ $ A_i \ $, \ $ B_i \ $, y \ $ Cin_i \ $) y dos bits fuera (\ $ Sum_i \ $ y \ $ Cout_i \ $.) Cada \ $ Cin_i \ $ está conectado a la anterior \ $ Cout_ {i-1} \ $, para que el acarreo de la suma anterior se tenga en cuenta en el siguiente bit. Este es exactamente el mismo proceso que harías al agregar los bits a mano, de manera muy similar a lo que aprendes cuando agregas decimales.

Ahora, este hecho omite lo que sucede con el bit de orden más bajo. ¿Qué obtiene su \ $ Cin_0 \ $? Bueno, con la adición normal donde no ha habido un acarreo de una operación de adición anterior, el valor para ello es '0'. Esto es lo que hace una instrucción ADD normal. También hay una instrucción especial ADDC, que "agrega con acarreo", de modo que un acarreo de un ADD anterior se puede usar en la suma de respuestas de varias palabras. En el caso de ADDC, \ $ Cin_0 = C \ $, donde 'C' es el resultado del bit de acarreo de la instrucción ADD anterior.

Ahora está configurado para comprender cómo se realiza la resta. La ALU generalmente también tiene acceso a las salidas \ $ Q \ $ y \ $ \ overline {Q} \ $ para los bits de las entradas al segundo parámetro para una operación. (Los Flip Flops tienen ambas salidas disponibles, fácilmente). Así que hay un MUX (algo que puede seleccionar entre \ $ B \ $ o \ $ \ overline {B} \ $.) Para restar, el \ $ \ overline { B} \ $ se elige en lugar de \ $ B \ $. Luego, también para realizar el +1 necesario para finalizar la negación, la ALU selecciona '1' como el arrastre al configurar \ $ Cin_0 = 1 \ $. Luego simplemente realiza el mismo ADD antiguo que siempre hace.

Guarda una gran cantidad de hardware de esa manera.

Es probable que una implementación real de un sumador ALU no utilice un sumador de ondulación. No porque no funcionen. Ellas hacen. Pero porque son un poco lentos. Tienes que esperar a que todos esos valores de acarreo fluctúen. Por lo tanto, existen métodos especiales de "mirar hacia adelante" para hacer que los valores de acarreo funcionen más rápido (más que solo una de estas ideas). Pero la idea básica es la misma, independientemente de los arreglos exactos utilizados. Y la instrucción SUB hace el mismo tipo de truco para evitar tener que construir una lógica de sustracción completamente diferente, cuando el sumador puede doblarse tan fácilmente para hacer el mismo trabajo.

De acuerdo con EE.SE, un esquema de comportamiento sería algo como esto:

simular este circuito : esquema creado usando CircuitLab

El esquema anterior podría simplificarse un poco simplemente colocando el bit de control de operación ADD / SUB (0 o 1) directamente en el \ $ C_ {in} \ $ del sumador para evitar el uso del mux. Pero en general, las ALU son un poco más complejas y en realidad hay un mux aún más amplio antes de \ $ C_ {in} \ $ de la ALU (seleccionando al menos uno de los siguientes cuatro: 0, 1, \ $ C \ $ y \ $ \ overline {C} \ $.)

EDITAR: su tabla no es correcta para adición de un solo bit. He circulado las partes incorrectas a continuación:

Pero si la tabla es para restar B de A, entonces necesito una aclaración sobre Cin porque los restadores no suelen estar construidos a partir de restadores de bit único. Por lo tanto, no puedo darle una respuesta directa para su mesa, ya que no estoy seguro de su intención con respecto a ella.

NOTA FINAL: trabajar a través de tres o cuatro muestras. Para hacer eso, inventa cualquier valor A de 4 bits. Luego inventa cualquier valor B de 4 bits. Toma B, invierte TODOS los bits a su opuesto para hacer \ $ \ overline {B} \ $. Ahora agregue \ $ A \ $ a \ $ \ overline {B} \ $ de la manera normal y calcule el resultado \ $ R \ $, eliminando cualquier acarreo del resultado. Ahora simplemente agregue '0001' a R. Ahora tiene su respuesta, para A-B.

    
respondido por el jonk
3

Si está trabajando en el complemento de 2, eso significa que TODOS los números están en el complemento de 2. Es decir, un número positivo comenzará con un '0' y un número negativo comenzará con un '1'

Entonces, si A y B son dos de esos números y quieres hacerlo (A - B), entonces complementas B de 2 y sumas a A.

    
respondido por el Chu
0

Respuesta corta: verifique el comentario del usuario110971.

Respuesta más larga:

La idea de un complemento de dos es que la adición funciona, incluso para combinaciones de números positivos y negativos. Si cuenta (en 3 bits) 000 001 010 011, etc., ¿qué sucede antes del 000? Bueno, obviamente, 111, porque si sumas 001 a 111 obtienes 000. Entonces ese es el valor de -1. Así que la lista de valores (para 3 bits) es

 3 : 011
 2 : 010
 1 : 001
 0 : 000
-1 : 111
-2 : 110
-3 : 101
-4 : 100

Es solo el orden de conteo normal (sin signo), pero la lista no es 000 ... 111 sino 100 .. 011. Si consideras que la lista es circular, esas dos listas son solo formas diferentes de cortar el círculo. Una línea recta. Es por eso que la misma unidad de cálculo (específicamente: el hardware de adición) puede trabajar con números firmados o sin firmar, sin siquiera saber con qué se trata (excepto los desbordamientos).

¿Aprendió cómo calcular el patrón de bits para -x cuando se le dio el patrón para x? El método es

  • voltear todos los bits
  • agrega uno

para calcular -2 en 3 bits comience con 2 en 3 bits, que es 010. Voltee todos los bits para obtener 101. Ahora agregue 001, para obtener 110. Lo que sucede es -2 en la lista. ¡Hurra! No intentes entender este proceso, solo aprendelo.

Ahora, ¿cómo podría una ALU calcular x - y? No tiene que Se puede calcular - y (utilizando el proceso anterior) y x + z. Así que en efecto podría calcular x + (- y). El hardware de ALU más antiguo realmente hizo esto en dos pasos (porque el hardware del sumador era la parte más cara, por lo que la ALU tenía solo una instancia).

    
respondido por el Wouter van Ooijen
0

La forma más sencilla de razonar acerca del complemento de dos es considerar tres principios:

  1. Los bits inferiores de la suma, diferencia o producto de cualquiera de los dos valores no se verán afectados por los bits superiores en los operandos.

  2. Para cualquier valor k, restar 1 de un número que termina con k ceros producirá un número que termina con k one; este principio generaliza a la idea de que restar 1 de 0 produce un número infinito de unos.

  3. Si define la extensión de signo de un número de k bits a l bits como prepagando lk copias del dígito más a la izquierda, el efecto de la extensión de signos de dos valores de k bits a l bits antes de sumar, restar, o multiplicarlos será lo mismo que realizar la operación en los k bits inferiores y luego extender el resultado del signo siempre que los primeros 1-k + 1 bits del resultado coincidan (es decir, numéricamente dentro del rango que se puede representar) por valores de k-bit con signo extendido).

Comprender lo anterior hará que otras propiedades de los números del complemento a dos (por ejemplo, el hecho de que el valor del bit de signo se invierta, la negación de un valor sea equivalente a invertir todos los bits y agregar 1, etc.).

    
respondido por el supercat

Lea otras preguntas en las etiquetas