C | A | B | R | V |
0 | 0 | 0 | 0 | 0 |
0 | 1 | 0 | 1 | 0 |
0 | 1 | 1 | 0 | 1 |
0 | 0 | 1 | 1 | 0 |
1 | 1 | 0 | 0 | 1 |
1 | 1 | 1 | 1 | 1 |
1 | 0 | 0 | 1 | 0 |
1 | 0 | 1 | 0 | 1 |
Un poco de la nomenclatura usada:
Variables A, B y R ya las conocen (A, B y Respuesta). Y aparecen otras dos, una es de entrada: la C, el "más uno que me llevaba" (que está en 1 si efectivamente me traje uno de la suma anterior, o está en 0 si nada me he traído), y la otra es de salida, la V, que viene a ser el "me llevo uno" para la próxima. O SEA: Si V es 0, C en la próxima operación es 0, y si V es 1, C en la próxima operación es 1.
Y con todas estas variables, hacemos la suma binaria.
El párrafo que sigue es para marearlos un poquito. Es la verdad del tema, que desvirtúa un poco lo visto con estas dos variables nuevas que aparecieron. Pueden seguir creyendo las cosas así como están, o entender la verdadera forma:
La variable V es una bandera para activar y poner a C en el estado acorde en la siguiente operación. Si esta bandera está en 0 (Falso), significa que todo está bien, que nada pasó. Pero si esta bandera V está en 1, significa que "algo pasó". Entonces lo que verdaderamente hace la computadora es "levantar" la bandera (la pone en 1) avisando que "me llevo uno" a la próxima suma, o "la baja" (la pone en 0) si no se lleva nada. La operación posterior "mira" como está esa bandera, y si está "levantada", se pone alerta porque sabe que algo distinto tiene que hacer, y, en este caso, sería poner a la variable C (Acarreo o Carry) en 1; y si estuviese abajo (o apagada), significa que todo está bien, y C vale entonces 0 (o no considero nada más para la suma, y sumo sólo A y B, solamente las dos variables de entrada). En el caso de la suma, a esta bandera de salida la llamaremos OVERFLOW (desbordamiento, la suma se pasó a un valor más alto de lo que puede valer) y la llamamos con la letra V.
Resta
Para empezar con esto, vamos a recordar los métodos de resta que ya conocemos, en sistema decimal.
Vamos al más simple:
456 (Minuendo, sólo para recordar, y así lo llamaremos)
–
142 (Sustraendo)
—–
314 (Resto y diferencia)
Avancemos un poco:
452
–
126
—–
326
Acá expliquemos qué hicimos en el sistema decimal: como 2 es menor q 6 y no le puedo sacar 6 a dos, entonces le pido 10 unidades al número precedente (al 5) quedando este (el 5) en 4 y el 2 en 12. Ahora si, a 12 le puedo restar 6, quedándome 6 en la diferencia. Después hago 4 (así había quedado el 5) menos 2, queda 2, y 4 – 1, queda 3.
4412
–
12 6
—–
326
Compliquémosla un poco más:
703
–
467
—–
236
Expliquemos esto ahora: 7 no entra en 3, así que tiene que pedirle 10 al número anterior. Pero resulta que este numero es un 0, y no le puede dar nada, así que tiene que pedirle a su anterior para poder restar, al 7, quedando así, en hilera, el 7 en 6, el 0 en 9 y el 3 en 13
6913
–
46 7
—–
236
Y, sobre este mismo caso, supongamos q tenemos:
70002
–
31234
——–
38768
Aplicando lo mismo de antes, el primer 0 le pide al anterior, que también es 0, así q le tiene que pedir nuevamente al anterior, que vuelve a ser 0, así que le pide a su anterior también, al 7 (al fin!), quedando:
699912
–
3123 4
——–
38768
Por qué tanto hincapié en el pedido cuando hay 0? Fácil: en binarios hay sólo 0 y 1, y la posibilidad de que aparezcan es de un 50% contra un 10% en el decimal, por lo que nunca le dimos tanta importancia al tema.
Veamos ahora otra forma de restar, a través del complemento de un número: viene a ser la diferencia que hay entre este número y su número natural potencia de diez más cercano hacia arriba. Para hacerla mucho más fácil, le restamos 1 y luego se lo sumamos.
Así, el complemento de 467 es 1000 (número potencia de 10 más cercano hacia arriba, más fácil, un 1 y la misma cantidad de dígitos que el número dado en 0s) -1, o sea, 999, mas fácil todavía, pongo la misma cantidad de 9s (que viene a ser el número más grande del sistema decimal, recordar esto !!!) + 1 nuevamente.
Así, el complemento de 467 es: 999 (1000-1) – 467 + 1 = 533
Entonces ahora en la resta que teníamos: 703 – 467, le sumamos a minuendo (el 703) el complemento del sustraendo (de 467) que ya averiguamos antes, que era 533, y descartamos el 1 final que sobra:
703
+
533
—–
1236
Sacamos el 1 del principio (digamos q le sacamos los 1000), y voila!, nos queda 236, que es lo mismo que 703-467 !!!
Con todo esto, deducimos que tenemos 4 componentes principales en la resta: Minuendo, Sustraendo, Resto y un tal "le pido"
Ya hemos tenido una breve introducción, un breve recordatorio, a la resta en el sistema "humano", el decimal, con algunas explicaciones extras a lo que nos enseñaron en la escuela.
Bueno, ahora pasemos a la resta pero en el sistema de la computadora, o sea, el decimal
Primero veamos en decimal "humanizado", sin pensar en cómo lo hace la computadora, y luego veremos una diferencia con el sistema empleado por la computadora.
A partir de ahora, llamaremos al minuendo: "A", al sustraendo: "B", al resultado: "R" y al "le pido": "C"
Igual que antes, empecemos fácilmente:
0 – 0 = 0
1 – 0 = 1
1 – 1 = 0
Y se acabó lo fácil. Ahora empecemos a complicarla, de a poco…
0 – 1 = ….
Le tengo que pedir al anterior, y tenemos:
110
–
001
—-
101
El 0 le pide al 1, que le puede dar, así que el 1 queda en 0, y el 0 queda en 10, asi 10-1 = 1 (pensar en binario!!!, sino pensar que 102 es 210 y 2-1 es 1 y listo!):
1010
–
00 1
—–
10 1
Digamos que está fácil, todavía, entonces hagámosla más difícil:
111000010110
–
001010101100
——————
…………………
Acá: 0-0=0, 1-0=1, 1-1=0, y arrancamos: 0-1 = 10 (pedido 1) – 1 = 1. El 1 anterior le puede dar, así que no hay problema. Luego 0 (1 convertido) – 0 = 0. En el próximo, el 0-1 vuelve a pedir, pero como el anterior es un 0, le pide al anterior, que es otro 0, asi que le pide a su anterior y así hasta llegar al primer 1 bondadoso que aparezca. Recordando que en el sistema decimal todos los 0 que quedan "en el medio" quedan en "9" (el decimal mas grande), aquí pasa lo mismo: todos "los del medio" quedan en 1. Ahora los extremos: el bondadoso donante queda en 0 (1-1) y el primero que pidió, al igual que antes, queda en 10, asi: 10-1 = 1 y todos los 1 "del medio" (les dije que se acuerden de este tema con los 9…) pueden operar fácilmente (como lo harían los "9") ya que su sustraendo nunca puede ser mayor que el, entonces sigue el tema digamos que fácilmente:
1101111010110
–
001010 101100
——————-
101101 101010
Al 0 convertido no le alcanza, por lo que le pide al anterior, quedando en 0 y 10 (igual que lo ya visto…)
Complemento en binario.
Es el mismo caso que en el decimal: busco el número q complementa a su número potencia 2 de misma cantidad de dígitos que el mismo, y luego le resto 1. En binario, tenemos que ese numero, así como en decimal era 99999…, es 1111111, y, de la misma forma, si yo resto cualquier número a 9999…. No le tengo q pedir nunca nada a nadie, y luego sólo sumo, acá pasa lo mismo:
111000010110 (12 dígitos)
–
001010101100 (12 dígitos)
——————
El complemento de 001010101100 es restarle a 1000000000000 (un 1 y 12 0s, la misma cantidad de dígitos que 001010101100), que vendría a ser lo mismo que restarle 1 al 1000000000000, quedándome: 111111111111 y luego de la resta, se lo vuelvo a sumar. Así, el complemento de 001010101100 sería:
11111111111
–
001010101100
——————
110101010011
Que, si bien lógicamente es la diferencia entre un número y otro, visto con ojo humano, donde hay un 1 pongo un 0 y donde hay un 0 pongo un 1
Ahora le sumo 1: 110101010011 + 1 = 110101010100 (ver suma de binarios si no se entiende esta suma)
Ahora entonces sumo a A el complemento de B más el 1 ese:
111000010110
+
110101010100
——————
101101101010
Con un 1 adelante, que, al igual que en el sistema decimal, lo elimino…
Bueno, todo esto es a nivel binario humano, tanto el pedir prestado de a más de uno hacia la izquierda, como la diferencia por número complementario. Esto se hace para facilitarnos a nosotros, las personas, el tema. Ahora, en informática, como sabemos, la computadora no piensa, no razona, no le puedo decir que haga un complemento, para que después reste de este (haría dos operaciones en vez de una), como tampoco podemos decirle que empiece a pedirle al otro y al otro y así, si no le alcanza. No puede ir "tan" allá a pedir. Sólo podemos pedirle al anterior y nada más. Bueno, en esto se basa en cómo trabaja la computadora. Como dijimos, no razona, por lo que se analizaron todas las situaciones de juego, se vieron los resultados, se analizaron, y se le dijo a la computadora: "dada las siguientes situaciones, vos tenés que hacer esto…", que es lo que veremos ahora.
Por lo visto, vamos a tener nuevamente al minuendo en A, al sustraendo en B, al resultado en R, y al "le pido", que llamaremos acarreo, en C. El acarreo va a cumplir un papel importante en la resta binaria informática, al igual que lo cumple el acarreo en la suma: el overflow, el "me pase, así que llevo 1 al de la izquierda" (o 10, que por pasar a la columna anterior, pasa 1), sólo que en el caso de la suma hace exactamente lo mismo que en la suma humana, por eso es mas fácil. Acá, en la resta, vamos a hacer un combinado de cosas que terminan mareando un poco. Para empezar, nuestro acarreo es una bandera, un avisador de que en el cálculo anterior (en forma humana, el cálculo de la columna anterior) no le alcanzó con lo que tenia, así que su diferencia le habría dado negativa, por lo que le ha tenido que pedir uno al cálculo que sigue.
Entendamos que la computadora hace también de derecha a izquierda, desde el bit menos significativo al bit más significativo, pero hace los cálculos de a uno, sin siquiera saber nada de lo que hay después, qué viene después. Si llega a pedir, no sabe si el que sigue le va a poder dar o no, sólo pide, y lo hace activando el acarreo, prendiendo una bandera, poniendo a C en "1".
Con esto tenemos que en las operaciones de resta, al igual que en las sumas, trabajamos con 3 datos de ingreso, y tenemos dos salidas: "A", "B" (minuendo y sustraendo) y "C", el acarreo del cálculo anterior para las entradas, y "R" (resultado, resto, diferencia) y "N" como acarreo para el próximo cálculo, que estaría en "0" si no hubiese pasado nada o en "1" si hubiese tenido que pedir prestado. Todos estos valores, como bien sabemos, pueden valer solamente "0" o "1". Llamamos al último "N" para no confundirlo con "C", por más que ya se estén dando cuenta que el "N" de un cálculo pasa a ser el "C" del cálculo inmediato posterior, y porque es la bandera "Negativo" en el registro de estado.
Mucho bla bla, mucha teoría introductoria, pero es necesaria para entender lo que viene, que es ver ya como hace la ALU de la computadora una resta.
Empecemos sabiendo que todas las banderas del registro de estado están apagadas (están todas en "0", así que nuestro primer "C" es 0, nadie le pide nada al primer cálculo que vayamos a hacer.
Los valores de "A" o "B" son los que se den para el cálculo.
Tenemos entonces para ver, al igual que en la suma, 23 = 8 combinaciones entre "A", "B" y "C" para la resta
Así tenemos para empezar:
C en 0:
A en 0 y B en 0: 0-0 sin acarreo, es 0 (R) y no pide nada (N=0)
A en 1 y B en 0: 1-0 sin acarreo es 1 (R) y no pide nada (N=0)
A en 1 y B en 1: 1-1 sin acarreo es 0 (R) y no pide nada (N=0)
Como antes, hasta acá lo fácil:
Con entrada C en 0, A en 0 y B en 0, tenemos R en 0 y N en 0
Con entrada C en 0, A en 1 y B en 0, tenemos R en 1 y N en 0
Con entrada C en 0, A en 1 y B en 1, tenemos R en 0 y N en 0
Las tres primera combinaciones de 8, las más fáciles.
Como antes, con la siguiente, comienzan los problemas:
A en 0 y B en 1: 0-1 (sin acarreo, C es 0) es 1 (R) y ahora ya pide (N=1)
Por qué es 1 esta diferencia? Porque pidió, como ya dijimos, no importa a quien, sólo pidió 1. Él pidió al anterior, no importa si puede darle o no, sólo le pidió. Y asumimos que alguien, en algún momento, le podrá dar, así que pasa a valer, como en el caso visto antes, 10 (2 decimal), un 1 a la izq de él (0).
Así, 10 – 1, como antes, es 1. O sea, R vale 1 y N vale 1, porque pide.
Tenemos acá el cuarto caso de los 8, el más fácil de los difíciles:
Con entrada C en 0, A en 0 y B en 1, tenemos R en 1 y N en 1
Con este cuarto caso se acabaron las combinaciones con el acarreo (C) en 0. A partir de ahora, veremos las 4 restantes, que serían las 4 combinaciones posibles entre A y B, pero con C en 1, o sea, asumiendo que le está prestando a alguien que le pidió antes. Igual que antes, arranquemos con el más fácil de los 4: que A valga 1 y que B valga 0:
A en 1 y B en 0: 1-0 (con acarreo, C es 1) es 0 (R) y ahora no pide nada (N=0)
Fácil de entender que si A era 1 y le podía dar al anterior, se lo da y pasa a valer 0, quedando así que 0-0 es 0. PERO, esto es visto a ojo humano!!. Si bien esto es lo correcto, asumamos ahora que el acarreo trabaja con los demás, con A y B, así, 1 (C) – 1 (A) – 0 (B) es 0. Digamos que es la forma en que tenemos que empezar a verlo, metiendo al acarreo en la resta misma, de 3 números.
Con entrada C en 1, A en 1 y B en 0, tenemos R en 0 y N en 0
Con esta van 5, quedan 3 todavía…
Veamos la que le sigue en dificultad:
A en 1 y B en 1: 1-1 (con acarreo, C es 1) es 1 (R) y pide 1: N = 1
Veamos qué pasó: como C es 1, A pasaría a valer 0 (por prestarle al que le pidió), y como no puedo restar 0 (el nuevo valor de A por haber prestado) – 1 (valor de B), así que quedaría pidiendo al próximo (N=1). Ahora, igual que antes, pensémoslo combinando el acarreo con los valores reales de A y B (todos en 1, como vinieron originalmente): 1 (C) – 1 (A) – 1(B) = 0 (C – A) – 1 (B) = 10 (y vuelve a pedir) – 1 (B) = 1 pidiendo 1, o sea:
Con entrada C en 1, A en 1 y B en 1, tenemos R en 1 y N en 1
Y así la sexta combinación… quedan 2, las más complicadas, con acarreo (C en 1) y A en 0, el postre del tema…
Empecemos por la más fácil de las dos, cuando B vale 0, tenemos entonces:
A en 0 y B en 0: 0-0 (con acarreo, C es 1) es 1 (R) y pide 1: N = 1
Veamos en detalle qué pasó acá: en forma humana estamos en la situación de que se le está pidiendo un valor al minuendo desde número anterior, pero A está en 0, por lo que no le puede dar el pedido, así que directamente pasaría a pedirle al anterior. De esta forma, de una nomás, N pasa directamente a valer 1, al igual que ocurrirá en el caso siguiente (así, siempre que le estén pidiendo a A, con C en 1, y A esté en 0, sí o sí va a tener que pedir, valga lo que valga B, el sustraendo, poniendo así a N en 1 para la próxima operación). Por tal motivo, A pasaría a valer 1 (Y NO 10, porque ya, supuestamente, le pasó al que le había pedido a él, vendría a ser el caso de los "999…" del medio en decimal o de los "111…" en binario visto antes. De acá, a vista humana, queda: 1 (A convertido) – 0 (B) = 1 (R) y pido 1 al próximo (N=1). Al igual que antes, hagámoslo ahora al estilo computadora, con acarreo y entradas: 1 (C) – 0 (A) – 0 (B) = 1 (C – A) – 0 (B) = 1 (R), con pedido para la próxima, o sea:
Con entrada C en 1, A en 0 y B en 0, tenemos R en 1 y N en 1
Y tenemos acá entonces la séptima combinación, la anteúltima.
Terminemos entonces con la octava, igual que antes, pero con B en 1
A en 0 y B en 1: 0-1 (con acarreo, C es 1) es 0 (R) y pide 1: N = 1
El tema de que esta operación termina pidiendo al próximo es exactamente igual al anterior, como ya vimos y dijimos que sucedería en el séptimo caso, por lo que no lo volveremos a explicar. Así que veamos la resta en si nomás. Tenemos: 1 (A convertido) – 1 (B) = 0 (R) y pido 1 al próximo (N=1). Como siempre, hagámoslo ahora al estilo computadora, con acarreo y entradas: 1 (C) – 0 (A) – 1 (B) = 1 (C – A) – 1 (B) = 0 (R), con pedido al próximo, o sea:
Con entrada C en 1, A en 0 y B en 1, tenemos R en 0 y N en 1
Y así, POR FIN, tenemos las ocho combinaciones entre entradas A y B y un acarreo (C), que resumiremos en el siguiente cuadro, que es el que usa la ALU para la resta:
Página anterior | Volver al principio del trabajo | Página siguiente |