      ASM POR AESOFT. (leccin 9).                     * Dedicada a Xavi *
      --------------------------------------------------------------------
     - BASES NUMERICAS (DECIMAL, BINARIA, ETC...)
     - CAMBIO DE BASE
     - REPRESENTACION NUMERICA: Rango, Resolucin, etc...
       * Coma fija sin signo (Binario Puro).
       * Complemento a 2.
       * BCD.
      --------------------------------------------------------------------

      Hola de nuevo a todos los seguidores del CURSO DE ASM.

      En esta leccin vamos a tratar un tema muy importante en programacin,
      como es el empleo de determinadas bases numricas (binaria y hexadecimal)
      para la representacin de la informacin.

      Al finalizar la leccin tendremos claro (eso espero :-) cmo se almacena
      un dato en la memoria, entenderemos por qu determinados tipos de
      datos (tipo byte, tipo palabra, etc..) admiten un rango de representacin
      determinado, as como una resolucin determinada, sabremos operar en
      bases diferentes a la decimal (base 10), etc, etc...

---   El Rango de representacin es el intervalo comprendido entre el menor
      nmero representable y el mayor.
      As por ejemplo, el rango del tipo de dato byte es 0..255.
      Es decir, se pueden representar nmeros desde el 0 al 255.
      El rango del tipo de dato palabra (Word) es 0..65535.
      Lo que es lo mismo, se pueden representar nmeros comprendidos entre el
      0 y el 65535, ambos inclusive.

---   La resolucin de la representacin es la diferencia numrica que existe
      entre un nmero representable y el inmediatamente siguiente.


     - BASES NUMERICAS
     -----------------
     Antes de entrar de lleno en las bases 2 y 16 que son las bases con las
     que trabaja el ordenador (en realidad el ordenador slo trabaja en
     base 2, la base 16 se utiliza de cara al programador para compactar
     el nmero resultante de utilizar la base 2, que sera muy largo y
     engorroso para utilizar constantemente en los programas)...
     ... antes de meternos de lleno con stas bases, como os deca, nos sera
     muy til para su entendimiento el saber del porqu de la base decimal.


     * Base Decimal (Base 10).
     Es la base a la que estamos acostumbrados desde siempre, la base numrica
     ms utilizada.
     En esta base 10, contamos con 10 dgitos: 0,1,2,3,4,5,6,7,8 y 9.
     Mediante estos 10 dgitos podemos expresar cualquier nmero que deseemos.

     El sistema de numeracin decimal (base decimal) es un sistema de
     numeracin posicional, al igual que los restantes sistemas que vamos
     a ver (binario, hexadecimal,etc), y a diferencia del sistema de numeracin
     romano, por ejemplo.

     Un sistema posicional es aquel en el que un nmero viene dado por una
     cadena de dgitos, estando afectado cada uno de estos dgitos por un
     factor de escala que depende de la posicin que ocupa el dgito dentro
     de la cadena dada.

     Es decir, que el dgito 9, valdr 9 si est al final de la cadena, en
     la posicin reservada para las unidades; valdr 90 si el dgito se
     encuentra en la posicin reservada para las decenas (2 posicin de
     derecha a izquierda); valdr 900 si el dgito se encuentra en la posicin
     reservada para las centenas; etc, etc...

     A esto es a lo que se le llama posicional, dependiendo de la posicin que
     ocupe un dgito dentro de la cadena numrica, tendr un valor o tendr
     otro.

     As por ejemplo, el nmero 8346 se podra descomponer como sigue:
     8346 = (8 * 10^3) + (3 * 10^2) + (4 * 10^1) + (6 * 10^0)

     El factor de escala de que hablbamos arriba, son las diferentes potencias
     de 10 que multiplican a un dgito dependiendo de su posicin dentro de
     la cadena numrica.

     Ahora nos podramos preguntar por qu tenemos como sistema de numeracin
     usual al sistema decimal, por qu es el ms usado por todo tipo de gente,
     a qu se debe que en todo el mundo sea el sistema utilizado por las
     personas (ya veremos que las mquinas no usan el sistema decimal, sino
     el binario).

     Pues es bien sencillo: Porque tenemos 10 dedos. :-)
     An recordaremos eso que nos decan (a quin no?) en clase cuando
     empezbamos a contar, sumar, etc.. : No vale contar con los dedos!
     Intuitivamente, utilizbamos nuestra elemental calculadora: las manos,
     para contar, realizar sumas y restas sencillas, etc.


     * Base Binaria (Base 2).
     En esta base slo contamos con 2 dgitos: 0 y 1.
     Al igual que la base decimal tiene su razn de ser, la base 2 o binaria
     tampoco ha surgido debido a un mero convencionalismo, sino que se basa
     en algo concreto: Electricidad.

     Toda la informacin que se manipula dentro de un ordenador se hace de
     acuerdo a seales elctricas. Es lo nico que entiende el ordenador.
     Mediante una seal elctrica alta, se representa el valor 1; mediante
     una seal elctrica baja se representa el 0.

     . (1) : Tensin elctrica alta.
     . (0) : Tensin elctrica baja.

     Todo el trabajo del procesador, buses, etc... se realiza de acuerdo a
     este sistema binario. Cuando se recibe una seal elctrica alta, se
     interpreta como que ha llegado un dato de valor (1). Cuando la seal
     es baja, el dato es un (0).

     Todo el flujo de datos en el interior del ordenador, y del ordenador
     con los perifricos, se realiza mediante estas informaciones elctricas.

     Para representar cadenas numricas, se emplean cadenas de seales
     elctricas.
     As por ejemplo, para representar el nmero 10001101 (base 2), el ordenador
     utilizara la cadena de seales elctricas:
     Tensin alta, Tensin baja, Tensin baja, Tensin baja,
     Tensin alta, Tensin alta, Tensin baja, Tensin alta.

     El factor de escala en esta base, son las potencias de 2 que afectan a
     un dgito dado dependiendo de su posicin en la cadena numrica.

     Obsrvese que al decir potencias de 2, me estoy refiriendo a potencias
     de 2 (en base 10). Es decir, para obtener la traduccin de ese nmero en
     base 2 a su valor correspondiente en base 10, utilizamos las potencias de 2
     mencionadas.
     Estas potencias de 2 en base 10, seran potencias de 10 en base 2.
     Es decir, el nmero 10 en base 2 equivale al nmero 2 en base 10.


     Vemoslo ms claro.
     El nmero 10100101 se puede traducir a base 10 como:
     10100101 = (1*2^7)+(0*2^6)+(1*2^5)+(0*2^4)+(0*2^3)+(1*2^2)+(0*2^1)+(1*2^0).
     O lo que es lo mismo:
     10100101 (base 2) = 128+0+32+0+0+4+0+1 (base 10) = 165 (base 10)


     * Base hexadecimal (Base 16).
     Como hemos mencionado al principio de la leccin, la base hexadecimal
     surgi para compactar la informacin binaria.
     Se utiliza un dgito hexadecimal para representar una cadena de 4 dgitos
     binarios.
     Teniendo en cuenta que con 4 dgitos binarios podemos representar 16
     nmeros diferentes: 0,1,10,11,100,101,110,111,1000,1001,1010, etc...
     ...Teniendo en cuenta esto, un dgito hexadecimal tiene que poder tomar
     16 valores diferentes.
     Para la base 10, tenemos 10 dgitos diferentes: del 0 al 9;
     para la base 2, nos servimos de dos de esos dgitos que ya tenamos para
     la base 10: el 0 y el 1.
     Pero en la base 16, que tenemos 16 dgitos diferentes, no podemos valernos
     slo de los dgitos de la base decimal, ya que slo hay 10 diferentes, y
     necesitamos 16.
     La solucin es utilizar letras para representar los 6 dgitos que nos
     faltan.

     Tenemos entonces que los dgitos hexadecimales son:
     0,1,2,3,4,5,6,7,8,9,A,B,C,D,E y F.

     A equivale a 10 en base 10.
     B equivale a 11 en base 10.
     C equivale a 12 en base 10.
     D equivale a 13 en base 10.
     E equivale a 14 en base 10.
     F equivale a 15 en base 10.

     Del mismo modo que en la base 10, el ltimo dgito es el 9; en la base
     2, el ltimo dgito es el 1; en la base 16, el ltimo dgito ser F.
     Si sumamos a F una unidad, obtendremos el nmero 10 (base hexadecimal).
     Este nmero 10h (se utiliza el sufijo 'h' para indicar que se trabaja
     con base hexadecimal, al igual que el sufijo 'b' indica que se est
     trabajando con base binaria) equivale a 16 en base 10.

     El factor de escala en esta base, son las potencias de 16 que afectan a
     un dgito dado dependiendo de su posicin en la cadena numrica.

     De forma similar que al hablar de la base binaria, al decir potencias
     de 16, me estoy refiriendo a potencias de 16 (en base 10). Es decir, para
     obtener la traduccin de ese nmero en base 16 a su valor en base 10,
     utilizamos las potencias de 16 mencionadas.
     Estas potencias de 16 en base 10, seran potencias de 10 en base 16.
     Es decir, el nmero 10 en base 16 equivale al nmero 16 en base 10.

     Difcil de entender?
     Vamos a ver si esto lo aclara:
     El nmero AF34h se puede traducir a base 10 como:
     AF34 (base 16) = (10*16^3)+(15*16^2)+(3*16^1)+(4*16^0) (base 10).
     O lo que es lo mismo:
     AF34 = (10*4096)+(15*256)+(3*16)+4 = 40960+3840+48+4 = 44852


     Hemos dicho que la base hexadecimal tiene como finalidad compactar la
     informacin binaria.
     4 dgitos binarios se puden compactar en un slo dgito hexadecimal.
     Tomemos por ejemplo el nmero 1010000101010101b. Nos es ms fcil
     indicar este nmero mediante su correspondiente nmero en base hexadecimal.
     Compactamos entonces toda esa cadena de informacin binaria en slo
     4 dgitos de informacin en base hexadecimal.
     El proceso para llevar a cabo este cambio es sencillo.
     De derecha a izquierda de la cadena numrica, se van cogiendo cadenas de
     4 dgitos binarios, y se transforman a su correspondiente dgito
     hexadecimal.
     Cojamos los primeros 4 dgitos binarios: 0101.
     0101 (base 2) = (0*8) + (1*4) + (0*2) + (1*1) = 5 (base 16).
     Siguiendo el proceso con el resto de la cadena, tenemos que el nmero
     resultante en base 16 es A155h, que es mucho ms fcil de recordar y
     almacenar (en cuanto a cdigo fuente se refiere) que el correspondiente
     en base 2.

     En caso de que el nmero en binario tenga menos de 4 dgitos, se rellenan
     las posiciones que faltan hacia la izquierda con ceros.
     Es decir, si tenemos el nmero 100101b, al pasarlo a base hexadecimal,
     tenemos el dgito de las unidades 5 (0101b), y para el dgito de las
     decenas tenemos que encontrar el correspondiente hexadecimal a la cadena
     10b, que es lo mismo que 0010b, O sea 2 en hexadecimal.
     Tenemos entonces que 100101b = 25h.


     Veamos una muestra de nmeros en las tres bases mencionadas para ver
     sus equivalencias:


    Decimal            Binario         Hexadecimal
    -------            -------         -----------
      0                   0                 0
      1                   1                 1
      2                  10                 2
      3                  11                 3
      4                 100                 4
      5                 101                 5
      6                 110                 6
      7                 111                 7
      8                1000                 8
      9                1001                 9
      10               1010                 A
      11               1011                 B
      12               1100                 C
      13               1101                 D
      14               1110                 E
      15               1111                 F
      16              10000                10
      32             100000                20
      40             101000                28
      64            1000000                40

      [...]         [.....]               [...]


      * Base octal (Base 8).
      Al igual que la base hexadecimal, se utiliza para compactar informacin
      binaria, pero en este caso, la compactacin es menor, de tal manera que
      casi no se usa.
      Mientras que en la base hexadecimal con un slo dgito se puede
      representar una cadena de 4 dgitos binarios, en la base octal un dgito
      slo puede representar 3 dgitos binarios.
      Los dgitos posibles para la base octal, evidentemente, son los que van
      del 0 al 7.

      No profundizaremos ms en esta base, ya que es totalmente similar a
      la base 16, y no se suele utilizar.


      - CAMBIO DE BASE
      ----------------
      A continuacin se detalla el procedimiento para obtener el equivalente
      de un nmero en cualquiera de las bases expuestas.

      Voy a prescindir de dar la teora del mtodo, para verlo directamente
      en la prctica.
      Tomemos un nmero dado en cada una de las diferentes bases.
      Por ejemplo el nmero 18732 en base decimal, que es 492C en
      base hexadecimal, y 100100100101100 en base 2.
      Veamos cmo se llega de uno de esos nmeros a otro, al cambiar de base.

      * Cambio de base 2 a base 10.

      100100100101100b = (1*2^14)+(1*2^11)+(1*2^8)+(1*2^5)+(1*2^3)+(1*2^2)=
                       = 16384+2048+256+32+8+4 = 18732 (base 10).


      * Cambio de base 10 a base 2.

     18732:2
      0  9366:2
      +-+   0 4683:2
           +-+  1 2341:2
                +-+  1 1170:2
                     +-+  0 585:2
                          +-+ 1 292:2
                              +-+ 0 146:2
                                  +-+ 0 73 :2
                                      +-+ 1 36 :2
                                          +-+ 0 18 :2
                                              +-+ 0 9 :2
                                                  +-+1 4 :2
                                                     +-+0 2 :2
                                                        +-+0 1 :2
                                                           +-+1 0
                                                              +-+

    Partiendo del ltimo resto de las sucesivas divisiones, y hasta llegar
    al primero, obtenemos: 100100100101100b, que es el equivalente en base 2
    del nmero 18732 en base 10.


      * Cambio de base 2 a base 16.

      100100100101100b = 100 1001 0010 1100 = 492C en base 16.
                         (4)  (9)  (2)  (C)

      * Cambio de base 16 a base 2.

      492Ch = 0100 1001 0010 1100 = 100100100101100 en base 2.


      * Cambio de base 16 a base 10.
      492Ch = (4*16^3)+(9*16^2)+(2*16^1)+(12*16^0)=
            = (4*4096)+(9*256)+(2*16)+(12) =
            = 16384+2304+32+12 = 18732 en base 10.

      * Cambio de base 10 a base 16.

     18732 :16
     12   1170 :16
     (C)   2  73 :16
     +---+  +-+ 9  4 :16
                +-+ 4 0
                    +-+

    Partiendo del ltimo resto de las sucesivas divisiones, y hasta llegar
    al primero, obtenemos: 492Ch, que es el equivalente en base 16 del
    nmero 18732 en base 10.


      Por supuesto, para automatizar el proceso de cambio de bases, existen
      calculadoras especiales, que permiten trabajar con diferentes bases,
      permiten representar en cada una de esas bases, realizar operaciones
      lgicas con los nmeros, etc.
      En la leccin anterior se ha hablado de este tipo de programas,
      as que no har ms incapi en lo sucesivo.


      - REPRESENTACION NUMERICA.
      --------------------------
      A continuacin vamos a ver las dos formas bsicas de trabajar con
      valores nmeros en ensamblador. Dependiendo de que trabajemos slo
      con nmeros naturales (enteros positivos, incluido el Cero), utilizaremos
      el sistema de representacin binario puro. Si trabajamos con nmeros
      enteros en general (positivos y negativos), se utiliza el complemento a 2.

      Adems de estos dos sistemas de representacin, veremos un tercero:
      El famoso BCD, que sirve para codificar y decodificar rpidamente
      informacin decimal (con la que estamos familiarizados) en una base
      binaria a la que no estamos tan acostumbrados.

      Aparte de los tres sistemas de representacin numrica mencionados, hay
      varios ms, como son: signo-magnitud, complemento a 1, etc, etc... que
      no vamos a tratar ahora, ya que o bien unos no son usados en el Pc,
      o bien son tan complejos de usar que se salen de la finalidad de este
      curso, al menos por el momento.


      * Coma fija sin signo (Binario Puro).
      Es el sistema usado para representar nmeros enteros positivos.
      Este es un sistema de representacin posicional con base 2 (binario),
      sin parte fraccionaria, y que slo admite nmeros positivos.
 
      Mediante este sistema se pueden representar (para un tipo de dato de
      longitud N) todos los enteros positivos desde 0 hasta (2^N)-1.
      Tenemos entonces que su rango es [0..(2^N)-1] y su resolucin es la
      unidad (1), ya que trabajamos con enteros.

      Antes de estudiar este sistema con los tipos de datos propios del
      ensamblador, y por tanto del ordenador, vamos a hacer un estudio del
      mismo con un tipo de dato general, para as comprender perfectamente
      y sin lugar a dudas la base de este sistema, sus caractersticas, etc.

      Tomemos una cadena numrica de longitud 2, es decir, dos dgitos.
      Con este sistema vamos a poder representar todos los enteros positivos
      en el rango [0..(2^2)-1] = [0..3].
      Es decir, mediante esta cadena numrica de 2 bits de longitud, podremos
      representar 4 nmeros enteros positivos diferentes:

                Cadena numrica:   XX
                                   --
               Nmeros posibles:   00
                               :   01
                               :   10
                               :   11

      Si la cadena numrica fuese de 1 slo dgito, slo podramos representar
      2 nmeros distintos: 0 y 1. En definitiva se trata de un slo bit.

      Tomemos ahora una cadena de 3 bits o dgitos de longitud (N=3).
      En este caso podremos representar todos los enteros positivos en el
      rango [0..(2^3)-1] = [0..7].
      Es decir, todos los nmeros enteros comprendidos entre 0 y 7.

      Veamos ahora este sistema de representacin con los 3 tamaos de datos
      bsicos en el Pc:

      - Tamao Byte (8 bits).
      La longitud de este tipo de dato es de 8 bits, es decir, N=8.
      Por tanto en este tipo de datos (y con el sistema de representacin
      Binario Puro), vamos a poder representar enteros comprendidos en el
      Rango [0..(2^8)-1] = [0..255].
      Esto quiere decir que en un registro o posicin de memoria de tamao
      byte (8 bits), vamos a poder tener 256 valores diferentes.

      - Tamao Word  palabra (16 bits).
      La longitud de este tipo de dato es de 16 bits.
      Por tanto en este tipo de datos (y con el sistema de representacin
      Binario Puro), vamos a poder representar enteros comprendidos en el
      Rango [0..(2^16)-1] = [0..65535].
      Esto quiere decir que en un registro o posicin de memoria de tamao
      palabra (16 bits), vamos a poder tener 65536 valores diferentes.
      O sea, que el mayor nmero que se podr representar en este tamao de
      dato, con este sistema de representacin es el 65535; y el menor nmero
      representable ser el 0.

      - Tamao DWord, Double Word,  Doble palabra (32 bits).
      La longitud de este tipo de dato es de 32 bits.
      Por tanto en este tipo de datos (y con el sistema de representacin
      Binario Puro), vamos a poder representar enteros comprendidos en el
      Rango [0..(2^32)-1] = [0..4294967295].


      * Complemento a 2.
      El sistema de representacin Complemento a 2, es el usado por el Pc
      (entre otras cosas) para poder realizar sumas y restas con nmeros
      enteros sin tener que hacer comprobaciones del signo de los operandos.
      Es decir, la instruccin ADD AX,BX se ejecutar igual si los nmeros
      son positivos, que si son negativos, que si uno es positivo y otro
      negativo.

      Veamos las caractersticas de este sistema de representacin desde un
      punto de vista prctico, para entenderlo mejor y ms rpido:

      Supongamos que estamos trabajando con el tipo de dato Byte (8 bits),
      luego N (longitud de la cadena numrica) es igual a 8.
      Si estuviramos trabajando slo con nmeros enteros positivos (binario
      puro), el registro  posicin de memoria admitira 256 valores positivos.
      Pero estamos utilizando el sistema de Complemento a 2, porque vamos a
      trabajar con enteros en general, positivos y negativos.
      Luego esos 256 valores han de dividirse en 2 grupos: uno para los
      positivos, y otro para los negativos.

      Para los nmeros positivos se reservan los cdigos que tengan el bit 7
      (bit ms significativo, ya que estamos trabajando con datos de 8 bits)
      con valor 0. Es decir, los cdigos 00000000 hasta 01111111.

      El resto de cdigos posibles se utilizan para representar los nmeros
      negativos. Es decir, los cdigos 10000000 hasta 11111111.

      Es fcil determinar de esta forma si un nmero es positivo o negativo.
      Si es positivo, su bit ms significativo valdr 0.
      Si es negativo, su bit ms significativo valdr 1.

      Hemos visto los cdigos reservados para cada grupo de nmeros, los
      positivos y los negativos. Veremos a continuacin las diferencias en
      la representacin entre los positivos y los negativos:

      Los nmeros positivos se representan en binario puro, como hemos visto
      en el apartado anterior. Es decir, si queremos representar el nmero
      37 en un registro de tipo byte, quedara de la forma 00100101.
      Como podemos observar, al utilizar nmeros positivos en Complemento a 2,
      estamos utilizando la representacin en Binario Puro.

      Hay que tener en cuenta el mayor nmero positivo representable en este
      tipo de dato (8 bits) y con este sistema de representacin.
      Es decir, no se pude representar nmeros positivos ms all del
      01111111b, por tanto el mayor nmero positivo representable es el 127
      para este tamao de dato byte.

      Todo lo expuesto hasta ahora (y a continuacin) para el tipo de dato byte,
      es extensivo para el resto de tipos de datos (palabra y doble palabra),
      teniendo en cuenta su diferente longitud (N), obviamente.

      En general, el rango de representacin de los nmeros positivos en el
      sistema de complemento a 2 es:   [0..(2^(N-1))-1]

     En el caso de dato de tipo byte: [0..(2^(8-1))-1]
                                      [0..(2^7)-1]
                                      [0..128-1]
                                      [0..127]

     Para el tipo de dato word:       [0..(2^(16-1))-1]
                                      [0..(2^15)-1]
                                      [0..32768-1]
                                      [0..32767]

     Etc....


      Con los nmeros negativos es cuando s se utiliza el Complemento a 2.
      Para representar un nmero negativo hay que realizar el complemento
      del nmero de la siguiente manera:
      Hay que restar el mdulo del nmero negativo a representar de 2^N.

      Por ejemplo: Para ver cmo quedara el nmero -108 en un registro de
      tipo byte, haramos lo siguiente:
      Tenemos una longitud de dato de 8 bits, luego N=8 y por tanto, 2^N=256.
      Ahora restamos a 256 el mdulo de (-108). Es decir, le quitamos a 108
      su signo, y lo restamos de 256.

        256                         100000000
       -108                         - 1101100
       ----                         ---------
        148                          10010100
                                     
                                     +- Observamos que el bit de ms a la
                                        izquierda tiene valor 1, indicando
                                        que se trata de un nmero negativo.


      A estas alturas, podremos apreciar que para representar un nmero
      negativo en complemento a 2, no introducimos ese nmero en el registro
       posicin de memoria, sino su complemento con respecto a 2^N.

      De esta manera, todos los nmeros negativos tendrn su bit ms
      significativo con valor 1, indicando su condicin de nmero negativo.


      Para obtener el rango de los nmeros negativos, tenemos que calcular el
      mnimo y el mximo representable.
      Tomemos el tipo de dato byte, para concretar:
      El ms pequeo nmero negativo es -1, y su complemento es 11111111.
      Como en los nmeros negativos, el bit ms significativo (bit 7 en este
      caso) debe ser 1, el mximo negativo representable ser el mximo al que
      se le pueda hacer el complemento sin que el bit ms significativo sea 0,
      ya que entonces sera positivo.
      Llegamos entonces a la conclusin de que tal mximo es -128, con
      el complemento 10000000b.

      En general, el rango de representacin de los nmeros negativos en el
      sistema de complemento a 2 es:   [-(2^(N-1))..-1]

     En el caso de dato de tipo byte: [-(2^(8-1))..-1]
                                      [-(2^7)..-1]
                                      [-128..-1]

     Para el tipo de dato word:       [-(2^(16-1))..-1]
                                      [-(2^15)..-1]
                                      [-32768..-1]

     Etc....


      El rango completo de representacin (negativos y positivos) en el sistema
      de Complemento a 2 es: [-(2^(N-1))..(2^(N-1))-1].
      Siendo N, la longitud del dato.


      Veamos algunos ejemplos de representacin para comprenderlo
      definitivamente...

      Ejemplo: Cmo se representar el nmero -7 en un registro de tamao word?
      Tamao word = 16 bits de longitud, luego N=16, y por tanto 2^N=65536.

        65536                  10000000000000000
        -   7                  -             111
        -----                  -----------------
        65529                   1111111111111001
                                
                                +- Bit ms significativo con valor 1, indicando
                                   nmero negativo.


      Ejemplo curioso: Supongamos que estamos trabajando con un tipo de dato
      byte. El nmero 10000000b representado en binario puro es 128,
      y representado en Complemento a 2, sera -128.
      Probad a realizar el complemento y obervaris que el complemento de
      10000000b es el mismo 10000000b (con N=8, claro).


      Como creo que para alguien que ha visto esto por primera vez, le
      resultar difcil de entender, y es posible que con lo expuesto hasta
      ahora no lo tenga del todo claro, me extender un poco ms:

      Lo que viene a continuacin es el quid de la cuestin de la
      representacin en Complemento a 2.

      Tomemos el registro AL, por ejemplo.
      Si AL = 10010101, tenemos dos nmeros diferentes dependiendo de que
      estemos teniendo en cuenta los nmeros negativos o no. Esto es,
      dependiendo de si estamos trabajando en binario puro o en complemento a 2.

      Es decir, en binario puro, el nmero 10010101 es 149 en base decimal.
      Mientras que si estamos basndonos en el Complemento a 2, el nmero que
      tendramos ya no sera un 149, sino que sera un nmero negativo por
      tener su bit ms significativo con valor 1. Ms concretamente se tratara
      del nmero -107.
      Para obtener el nmero negativo del que se trataba, hacemos el
      complemento a 2. Como el nmero ya estaba en complemento a 2,
      complemento con complemento se anulan, y obtenemos el original nmero
      negativo que es -107.

      Es decir, 256-149=107.
      Ahora le ponemos el signo, y tenemos el -107.

      Hemos visto, pues, que dependiendo de que tengamos en cuenta (Complemento
      a 2)  No (Binario Puro) el signo de un nmero, ste podr tener 2
      valores diferentes, el nmero positivo, y su complementario negativo.

      Pero esto slo sucede, obviamente, con los nmeros que tienen el bit
      ms significativo con valor 1.
      Si tomamos por ejemplo el nmero 3, dar igual que estemos trabajando
      con binario puro o complemento a 2, tendremos en ambos casos el nmero
      positivo 3, ya que el bit ms significativo al ser 0, no deja la
      posibilidad de ser un nmero negativo.

      Hemos dicho arriba que el ordenador utiliza el sistema de Complemento a 2
      por la comodidad que le supone para realizar las sumas y las restas.
      Veamos cmo lleva a cabo el ordenador estas operaciones, y as
      entenderemos mejor el porqu de este sistema de representacin.

      Supongamos que queremos sumar los registros AL y CL.
      Estamos trabajando en nuestro programa con nmeros positivos y negativos,
      con lo cual el sistema de representacin que tenemos que tener presente
      es el de Complemento a 2.

      Dmosle valores a AL y CL:  AL=-37.   CL=120.
      Tenemos pues un nmero negativo y otro positivo. Veamos cmo se
      representan ambos nmeros en sus respectivos registros, teniendo en
      cuenta las caractersticas de la representacin en Complemento a 2.

      AL=11011011
      CL=01111000

      Como podemos observar, en AL tenemos el nmero en Complemento a 2,
      mientras que en CL, el nmero quedara como binario puro.

      Tras realizar la suma (ADD AL,CL), en AL deber quedar el valor 83,
      positivo, por supuesto.
      Veamos si es as. Realicemos la suma:

                AL=11011011
              + CL=01111000
              -------------
                  101010011
                  
                  +--Este bit se desprecia, ya que se sale del registro de
                     8 bits. Ocupara una novena posicin que no hay.
                     Tenemos entonces  AL=01010011.

      Veamos el equivalente de 01010011b en base decimal. Para que la operacin
      sea correcta, deberamos obtener el valor 83 = ((-37)+120).
      Haced ese cambio de base que os digo, y obtendreis el resultado que
      esperbamos (83).


      Supongamos ahora que queremos sumar los registros AL y CL de nuevo,
      pero esta vez estamos trabajando con dos nmeros positivos, con lo cual,
      el sistema de representacin que nos interesa es el de Binario Puro.

      En esta ocasin, CL tiene el mismo valor que antes, CL=120.
      Pero AL que ahora es un nmero positivo tiene un valor al azar, por
      ejemplo el valor 219.

      AL=219
      CL=120

      Tenemos pues, dos nmeros positivos. Veamos cmo se quedaran ambos
      nmeros en sus respectivos registros.

      AL=11011011
      CL=01111000

      Qu casualidad!!! :-)
      Pero si tienen los mismos valores que en el ejemplo anterior!!!

      Tengamos en cuenta en este caso, que al realizar la suma vamos a obtener
      desbordamiento, ya que 120+219=339 que sobrepasa el valor 255 (mximo
      nmero representable en binario puro para un tipo de dato de 8 bits).
      Ese 339 en binario sera 101010011. Los bits que caben en el registro son
      los 8 de la derecha: 01010011, que en base decimal es 83!!!

      Veamos si es as. Realicemos la suma:

                AL=11011011
              + CL=01111000
              -------------
                  101010011
                  
                  +--Este bit se desprecia, ya que se sale del registro de
                     8 bits. Ocupara una novena posicin que no hay.
                     Esto lo indica el procesador mediante el flag de Overflow
                     Of.
                     Y el registro nos queda con el contenido AL=01010011.

     01010011b en base decimal es 83 como hemos indicado arriba.

     Mediante estos dos casos prcticos, llegamos a la conclusin del valor
     que tiene el sistema de representacin Complemento a 2.
     Os sugiero que si an queda algn pice de duda en cuanto a este sistema
     de representacin usado por el ordenador para representar los nmeros
     negativos, os pongais vuestros propios ejemplos:
     Suma de nmero negativo y nmero negativo.
     Resta de nmero negativo y nmero positivo.
     Resta de nmero negativo y nmero negativo.
     Etc...

     De esta forma, se comprender de forma prctica el sistema de
     representacin numrica que usa el Pc para estos nmeros enteros, y el
     porqu del mismo.


     Para finalizar con el apartado de Complemento a 2, veamos unos ejemplos
     de representacin para unos valores dados, en los que se comparan las
     representaciones Binario Puro y Complemento a 2.
     En este caso, estos valores se van a encontrar almacenados en un
     registro de 8 bits (tamao byte), por ejemplo AL.


   Contenido de AL          Binario Puro      Complemento a 2
   ---------------          ------------      ---------------
     00000000                     0                  0
     00000001                     1                  1
     00000010                     2                  2
     00000101                     5                  5
     00100000                    32                 32
     00111101                    61                 61
     01111111                   127                127
     10000000                   128               -128
     10000001                   129               -127
     10000111                   135               -121
     10111111                   191                -65
     11111110                   254                 -2
     11111111                   255                 -1



     * BCD (Sistema Decimal codificado en Binario).
     Este sistema BCD, sirve (como hemos mencionado antes) para codificar y
     decodificar rpidamente informacin decimal en una base binaria.

     Se utiliza un byte para almacenar cada dgito decimal.
     Es decir, mediante este mtodo no se realiza la traduccin de una
     cadena numrica en base decimal a la base binaria propia del ordenador,
     sino que se almacena como una cadena de bytes, uno de ellos para cada
     dgito de la cadena decimal introducida.

     Mientras que el nmero 133 en base decimal se almacena en un slo byte
     utilizando el sistema de representacin Binario Puro, necesitar 3 bytes
     para ser representado en BCD.
     La representacin en BCD sera la cadena de bytes '1','3','3'.
     Es decir, los bytes con cdigo ASCII 31h,32h,33h.

     El nmero 23849 necesitara slamente 2 bytes (una palabra) para ser
     representado en Binario Puro, mientras que en BCD necesitara 5 bytes,
     uno para cada dgito decimal. 32h,33h,38h,34h,49h.

     Lo expuesto hasta ahora sobre el sistema BCD, tiene un carcter
     orientativo.
     En esta leccin no abordaremos en detalle este sistema de representacin,
     ya que no me parece interesante.
     De cualquier modo, en una futura leccin le prestaremos ms atencin a
     este sistema, simplemente para que lo conozcais mejor.
     Eso os lo dejo a vuestra eleccin.
