Orga1: demostraciones sobre Complemento a 2 Manuel Giménez (manugimenez@gmail.com) 3 de abril de 2012 Esto es un apunte opcional para los que, afortunadamente, no se conforman con la frase “complemento a 2 anda y ya". Que quede claro que esto no entra en ninguna instancia de evaluación. de la materia. Cualquier error o consulta, no duden ni un segundo en acercarse. Justificacion del funcionamiento de sumas con C2 La pregunta que queremos contestar es: ¿por qué funciona sumar en complemento a 2 el número m con el −n?. Primero, ¿que quiere decir sumar m y −n en complemento a 2? Es obtener la tira de bits que representa al número m en complemento a 2, hacer lo mismo para −n, y sumar las tiras de bits como si se tratara de binarios sin signo. Ahora bien, ¿por qué la tira de bits resultante de esa suma, representa en complemento a 2 el número resultado de la operación m + (−n)? Demostración Sea un sistema de representación de números enteros por complemento a 2, de k bits. Sean m y −n números en el intervalo [2k−1 − 1; 2k−1 ] (es decir, son número que se pueden representar con un sistema complemento a 2 de k bits) tal que m > 0 y −n < 0 Sean m∗ y (−n)∗ las tiras de bits de las representaciones en complemento a 2 de los número m y −n respectivamente. Por definición de complemento a 2 vale que, ((−n)∗ )2 = 2k + (−n) y que (m∗ )2 = m. El resultado de sumar las tiras m∗ y (−n)∗ como si fueran binarios sin signo, será una tira de bits r∗ tal que (r )2 = ((−n)∗ )2 + (m∗ )2 . Luego (r∗ )2 = 2k + (−n) + m = 2k + (m − n). ∗ Casos: Si (m − n) = 0 (r∗ )2 = 2k , por lo que r∗ = 1 0| .{z . . 0}. Es decir, obtendremos la tira de todos ceros, y carry. Luego, el k resultado será la tira de k bits que en complemento a 2 representa el número cero. Si t = (m − n) < 0 (r∗ )2 = 2k + t < 2k , por lo que sabemos que r∗ tiene a lo sumo k bits (es decir entra en nuestro sistema de representación). Además por definición de complemento a 2, r∗ es la representación de t utilizando complemento a 2. (pues (r∗ )2 = 2k + t y además t < 0) Si t = (m − n) > 0 Observación: vale que (m − n) < m, luego 0 < (m − n) < m. Entonces 2k < (r∗ )2 = 2k + t < 2k + m. Como 2k < (r∗ )2 , y necesito k + 1 bits para representar 2k en binario, podemos decir que r∗ tiene al menos k + 1 bits. Veamos que tiene exactamente k + 1. Como m era positivo y representable en nuestro sistema con k bits, vale que 2k + m = (1 0| .{z . . 0})2 + (m∗ )2 . Entonces podemos afirmar que 2k + m = 1 m∗k . . . m∗1 . | {z } k bits k bits 1 Ahora, siendo que (r∗ )2 < 2k + m, podemos afirmar que la representación de r∗ tiene cómo máximo k + 1 bits. Utilizando el resultado anterior, podemos afirmar que tiene exactamente k + 1 bits. Teniendo en cuenta que, si llamamos t∗ a la representación en binario del número t, vale que 2k + t = (2k )2 + (t∗ )2 , por lo que ahora sabemos que: r∗ = 1 t∗k . . . t∗1 (tener en cuenta que t < m, por lo que la representación de | {z } k bits t tendrá a lo sumo k bits). Luego, como nuestro sistema de representación es de k bits, la tira de bits resultante es t∗k . . . t∗1 y además tendremos carry. Teniendo en cuenta la definición de complemento a 2, y que t > 0, la tira de bits resultante representa en complemento a 2 al número t. Vimos entonces que en todos los casos la tira de bits resultante, si es interpretada en complemento a 2, representa el número esperado como resultado de la operación aritmética realizada. Algoritmo del inverso aditivo en C2 Dado un número n, para encontrar la representación en complemento a 2 de su inverso aditivo (es decir −n): Escriba en binario el número n (utilizando tantos bits como disponga su sistema de representación) Haga un NOT bit a bit (donde hay un 0 ponga 1 y viceversa). Tome la tira de bits resultante, e interpretándola como un numero escrito en binario, súmele 1. La tira de bits resultante es la representación en complemento a 2 del numero n. Lema auxiliar Dado n un número, y n} su representación en binario de a lo sumo k símbolos, sucede que (n} )2 + (not(n} ))2 = (2k − 1)10 . Nota de Manu Diferenciar bien para entender la demostración de correctitud: n es un número, y n} es una tira de símbolos (palitos (unos) y circulitos (ceros)), que es la representación en base 2 del número n. La demostración formal del lema no aporta nada, asi que no la pongo. Si hay algún fanático de la inducción que quiere saberla, nos tomamos un café y le cuento cómo es. La idea intuitiva es que al sumar las tiras de bits n} con not(n} ), cada “columna” cuando sumemos va a tener un cero y un uno; luego en cada posición del resultado va a haber un uno - y como tenemos k posiciones, el resultado será una tira de k unos, que si lo interpretamos como un número binario, es el número 2k − 1. Ejemplo: sucede que (9)10 = (1001)2 . Siendo que not(1001) = 0110, vale que 1001 + 0110 = 1111. Como dice el lema, vale que (1001)2 + (not(1001))2 = (1111)2 = (24 − 1)10 Demostracion correctitud algoritmo Qvq: El resultado del algoritmo es la representación en complemento a 2 del dato de entrada. Dada como entrada el número m, y si llamamos m} a la tira de bits que interpretado como número binario representa al número m, el retorno del algoritmo será la tira de bits que resulta de hacer not(m} ) + 1. (Ver algoritmo más arriba si no me crees: niego bit a bit y después sumo 1) Teniendo en cuenta la definición de complemento a 2, sabemos que la representación en complemento a 2 del número (−n) es la tira de bits que interpretada como un numero binario sin signo representa al número 2k +(−n). Ahora bien, del Lema anterior, se desprende que (not(n∗ ))2 = (2k − 1)10 − (n} )2 . Pero entonces podemos afirmar que (not(n} ))2 + 1 = (2k − 1)10 − (n} )2 + 1 = (2k )10 + (n} )2 . Vale entonces que la tira de bits resultante de ejecutar el algoritmo, interpretada como un número binario, representa al número (2k )10 − (n} )2 . 2 Es decir, representa al número 2k − n. Eureka! Entonces la tira de bits resultante de ejecutar el algoritmo es la representación en complemento a 2 de k bits del número −n. 3