domingo, 18 de marzo de 2012

Complemento a 2

Que es? Es una forma de manejar números negativos en binario. Como se hace?
Ejemplo de Complemento a dos
Sea una representación en formato de Complemento a dos que nos permite codificar en binario en punto fijo con 8 bits (un byte). Al igual que con la representación en Signo y Magnitud, y Complemento a uno, esto nos otorga 1 bit para el signo y 7 bits para la magnitud. Con 8 bits, podemos representar, 28 = 256 números. Los cuales, según éste formato, van a estar repartidos entre 128 números positivos (bit de signo en 0) y 128 números negativos (bit de signo en 1).
Supongamos ahora, que tenemos que representar el número -9710. Procedemos a:
Tomar nota del signo del número -9710, que siendo negativo, llevará como bit de signo un 1;
Como el signo es negativo, el número a continuación del bit de signo, deberá expresarse en complemento a dos. Al realizar la conversión: el valor absoluto de -9710 es |-9710| = 9710. Que en binario es: 11000012, y el complemento a uno de 11000012 es C1(1100001) = 00111102, le sumamos uno para obtener el complemento a dos: 00111102 + 00000012 = 00111112;
Colocar todo junto, el número -9710 en binario con formato de Complemento a dos es: 100111112. Donde el 1 en el bit más significativo indica un número negativo, y 00111112 es el significando en complemento a dos del valor absoluto del número.
Para el caso inverso, dado un número binario en Complemento a dos, por ejemplo, 101101012, procedemos a:
Analizar el bit más significativo, que siendo un 1 indica que el número es negativo;
Convertir el significando a la base deseada, por ejemplo, en decimal, tomando en cuenta que: el valor obtenido está en valor absoluto, que la magnitud real estará dada por el bit de signo obtenido antes, y que en caso de ser bit de signo negativo (como es el caso) se deberá obtener el complemento a dos: C2(0110101) = C1(0110101) + 00000012, luego C1(0110101) = 10010102, y al sumarle 1, 10010112 = |7510|. Siendo que el bit de signo es 1, el número real es -7510. Si el bit de signo fuese 0, el número hubiese sido 01101012 = +5310 (sin complementar a dos).