Vous êtes sur la page 1sur 29

Captulo 3

Sistemas de numeracin

En este captulo se estudian los sistemas de numeracin usados en sistemas


digitales, las tcnicas para convertir entre bases de numeracin y cmo hacer operaciones bsicas en binario.

3.1.

Introduccin

A lo largo de la historia se han usado diferentes sistemas de numeracin. Uno


que se sigue usando en la actualidad, aunque muy poco, es el sistema romano.
Como sabr, en estos nmeros existen una serie de smbolos con un valor jo y
unas reglas muy sencillas para interpretarlos. Bsicamente hay que sumar todos
los smbolos, salvo cuando uno de menor valor precede a uno de mayor valor, en
cuyo caso se resta el menor del mayor. Por ejemplo:

XXVII = 10 + 10 + 5 + 1 + 1 = 27
IX = 10 1 = 9
El mayor inconveniente de este sistema de numeracin, aparte de su legibilidad,
es que no es fcil realizar operaciones con ellos. Existen algoritmos para sumar y
restar que son relativamente fciles. Sin embargo la multiplicacin es compleja y
la divisin es imposible. Aunque en [Chu-Carroll, 2006] se muestran los algoritmos
para operar con nmeros romanos, ciertamente es ms cmodo realizar la operacin
convirtiendo los nmeros a decimal, hacer la operacin y luego volver a convertir a
nmeros romanos:

XXVII + IX = 27 + 9 = 36 = XXXVI
Debido a esto, se estableci un sistema de numeracin ms potente, el decimal,
que aparte de ser mucho ms legible y poder representar nmeros grandes,1 permite
realizar operaciones fcilmente.
1
El mayor smbolo de los nmeros romanos es el M (1000), por lo que para representar por
ejemplo el nmero 1.000.000 sera necesario escribir 1.000 M seguidas.

35

36

3.2.

Sistemas de numeracin

Sistemas de numeracin posicionales

El sistema de numeracin decimal es mucho ms til debido a que es un sistema


de numeracin posicional, es decir, el valor de cada dgito depende de la posicin en
la que se encuentra dentro del nmero. As, en el nmero 27 el 2 tiene un valor de
2 decenas, mientras que en el nmero 72, el mismo 2 tiene un valor de 2 unidades.
Por el contrario, en los nmeros romanos cada letra tiene siempre el mismo valor,
independientemente de donde se encuentre. As, en el nmero XI la X vale 10, y en
el IX, la X tambin vale 10.
En concreto, en un sistema de numeracin posicional cada cantidad se representa por una secuencia de smbolos (dgitos), de forma que el valor representado es
igual a la suma de los productos de cada smbolo por un valor (peso) que depende
de la posicin del smbolo.

3.2.1.

Representacin del tiempo

El tiempo se puede representar mediante un sistema posicional. Por ejemplo,


1:33:27 equivale a 1 hora, 33 minutos, 27 segundos, o lo que es lo mismo: 1 60
60 + 33 60 + 27 segundos.
Si el tiempo a representar es mayor que un da, se aadira un dgito ms por
la izquierda: 2:1:33:27 equivale a 2 das, 1 hora, 33 minutos, 27 segundos, o lo que
es lo mismo: 2 24 60 60 + 1 60 60 + 33 60 + 27 segundos.
El usar 60 como peso para horas, minutos y segundos es una herencia de los
Sumerios, que empezaron a usarlo en el ao 2000 AC. La razn de usar 60 es que
es divisible por 12 nmeros: 1, 2, 3, 4, 5, 6, 10, 12, 15, 20, 30 y 60. Esto hace
que muchas fracciones de los nmeros en base 60 (sexagesimales) sean enteras. En
la actualidad los nmeros sexagesimales se usan para expresar tiempo, ngulos y
coordenadas geogrcas.

3.2.2.

Sistemas de numeracin polinmicos

Cuando en un sistema de numeracin posicional los pesos se incrementan segn


una progresin geomtrica. decimos que es un sistema de numeracin polinmico.
En estos casos la progresin geomtrica se forma con las potencias de un nmero
al que se denomina base.
El sistema decimal es el ejemplo ms conocido de este tipo de sistema de numeracin. As cuando escribimos 1327, la cantidad que se est representando es:
1327 = 1 1000 + 3 100 + 2 10 + 7 1 = 1 103 + 3 102 + 2 101 + 7 100
Como se puede observar, la base usada en el sistema decimal es 10 (de ah su
nombre).
En general, dado un nmero dn 1 dn 2 d1 d0 , en una base b, la cantidad rep-

37

3 Sistemas de numeracin

resentada por el nmero es:


dn 1 dn 2 d1 d0 = dn 1 bn 1 + dn 2 bn 2 + + d1 b1 + d0 b0 =

n 1

i =0

di bi

Si el nmero contiene una coma, la frmula anterior se generaliza a:


dn 1 d1 d0 , d1 dm = dn 1 bn 1 + + d1 b1 + d0 b0 +

+ d1 b1 + + dm bm =
Por ejemplo, el nmero 123,42 equivale a:

n 1

i =m

di b i

123, 42 = 1 102 + 2 101 + 3 100 + 4 101 + 2 102 =

= 1 100 + 2 10 + 3 1 + 4 0, 1 + 2 0, 01

Por otro lado, es conveniente resaltar que el nmero de smbolos necesarios para
representar cada dgito es igual a la base. As en el sistema decimal se necesitan
diez smbolos: 0, 1, 2, 3, 4, 5, 6, 7, 8 y 9.

3.2.3.

El sistema binario

Nosotros usamos el sistema decimal porque tenemos 10 dedos.2 Sin embargo,


en un sistema digital slo existen dos smbolos: 0 y 1. Por tanto para representar
un nmero slo puede usarse base 2. No obstante, el manejo de nmeros en binario es exactamente igual al de nmeros decimales. Por ejemplo el nmero 10012
representa3 la cantidad:
10012 = 1 23 + 0 22 + 0 21 + 1 20 = 1 8 + 0 4 + 0 2 + 1 1 = 9
A pesar de esto, el manejo de nmeros binarios es un poco incmodo por dos
razones:
Para representar una cantidad se necesita una gran cantidad de dgitos, lo
cual hace que sean difciles de memorizar, escribir, etc. Se dice que estos
nmeros son poco expresivos.
La falta de costumbre hace que nos sea difcil hacernos una idea de la cantidad
que representa un nmero en binario, cosa que no ocurre en decimal.
No obstante no todo son inconvenientes. Los nmeros binarios tambin tienen
sus ventajas.
Al necesitar slo dos smbolos pueden almacenarse y procesarse en un sistema digital.
2

Los mayas usaban un sistema de numeracin en base 20 [Wikipedia, 2010]. Es de suponer


que usaban los dedos de las manos y de los pies para contar.
3
Para evitar confusiones, en este texto los nmeros que estn en una base distinta a la decimal
se distinguirn poniendo su base como un subndice del nmero.

38

Sistemas de numeracin

Las operaciones son muy sencillas. Por ejemplo las reglas de la suma son slo
4 frente a las 100 de los nmeros decimales:
0+0=0
0+1=1
1+0=1
1 + 1 = 10
Ntese que en la ltima ecuacin 10 representa el nmero dos en decimal, no
el 10.4
En conclusin los sistemas digitales slo pueden trabajar con nmeros binarios,
pero a nosotros nos resulta incmodo trabajar directamente con ellos. La solucin
consiste en dejar a los sistemas digitales que trabajen en binario, trabajar nosotros
en decimal y realizar las conversiones de bases cuando tengamos que transferir un
nmero a/desde un sistema digital.

3.3.

Conversin entre bases

Como se acaba de decir, es frecuente en la prctica tener que convertir nmeros


de binario a decimal y viceversa. En esta seccin se expone cmo realizar estas
conversiones.

3.3.1.

Conversin de binario a decimal

Para pasar de binario (o de cualquier base b) a decimal basta con aplicar la


frmula:
N =

n 1

i =0

di b i

En donde b es la base, que recordemos que en binario es 2. Por ejemplo, para


convertir el nmero 10110012 a decimal, basta con calcular:
10110012 = 1 26 + 0 25 + 1 24 + 1 23 + 0 22 + 0 21 + 1 20 = 89
Si el nmero a convertir tiene una coma binaria la conversin se realiza usando
la frmula generalizada:
N =
int main(void)
{
printf("Hola\n");
return 0;
}

n 1

i =m

di b i

Por ejemplo, la conversin 111,011 a decimal se realiza:


111, 0112 = 1 22 + 1 21 + 1 20 + 0 21 + 1 22 + 1 23 = 7, 375

Realice el ejercicio 1

4
Existe una frase graciosa, slo apta para frikis: Existen 10 tipos de personas: las que saben
binario y las que no.

3 Sistemas de numeracin

3.3.2.

39

Conversin de decimal a binario

Para convertir un nmero decimal a binario existen varias tcnicas, aunque la


ms usada es la de divisiones sucesivas. Esta tcnica consiste en ir dividiendo el
nmero a convertir entre dos e ir anotando los restos de las divisiones parciales.
Se termina de dividir cuando el resultado es cero, formndose el nmero binario
leyendo los restos obtenidos de derecha a izquierda. Lo mejor es ilustrar el proceso
mediante un ejemplo. As, la conversin del nmero 13 a binario se realiza:

13 2
1 6 2
0 3 2
1 1 2
1 0
Por tanto, 13 = 11012 .
El algoritmo anterior slo es vlido para la parte entera del nmero. La parte
decimal se convierte mediante multiplicaciones sucesivas. Para ello se toma dicha
parte decimal y se multiplica sucesivamente por dos. La parte entera del resultado
es el bit resultante de la conversin y la parte decimal se vuelve a multiplicar por
dos. El algoritmo naliza cuando la parte decimal del resultado sea cero o cuando
hayamos obtenido el nmero de bits deseado para la parte fraccionaria. El nmero
en binario se forma leyendo de arriba a abajo las partes enteras obtenidas de las
multiplicaciones. Al igual que antes, lo mejor es ilustrar el algoritmo mediante un
ejemplo:
0, 375 2 = 0, 75
0, 75 2 = 1, 5
0, 5 2 = 1, 0

Por tanto, 0, 375 = 0, 0112 y teniendo en cuenta la conversin anterior, 13, 375 =
1101, 0112 .
Si la parte fraccionaria no es divisible entre dos no se puede representar con un
nmero nito de bits. Por ejemplo, la conversin a binario de 0, 3 se realiza:
0, 3 2 = 0, 6

0, 6 2 = 1, 2
0, 2 2 = 0, 4
0, 4 2 = 0, 8
0, 8 2 = 1, 6
0, 6 2 = 1, 2

40

Sistemas de numeracin

Como se puede observar, a partir de la sexta lnea se repite el resultado obtenido


de la multiplicacin, por lo que el resultado nunca podr tener cero como parte
En estos casos, dado que en un sistema
fraccionaria. Es decir, 0, 3 = 0, 01001.
digital el nmero de bits es nito, se termina la conversin cuando se obtengan los
bits reservados a la parte fraccionaria del nmero. En este caso la representacin
binaria no ser exacta, cometindose un error de cuantizacin. En el ejemplo
anterior, si tenemos que representar 0, 3 con slo 6 bits para la parte fraccionaria,
obtendremos:
0, 0100112 = 0 21 + 1 22 + 0 23 + 0 24 + 1 25 + 1 26 = 0, 296875
El error de cuantizacin cometido es igual a:

e=

0, 3 0, 296875
0, 3

100 % = 1, 04 %

En general, el error de cuantizacin se obtiene mediante la frmula:

e=

numerooriginal numeroaproximado
numerooriginal

100 %

Por ejemplo, al convertir 13, 3 a binario usando 6 bits para la parte fraccionaria, el
resultado es 1101, 0100112 , siendo el error de cuantizacin:
int main(void)
{
printf("Hola\n");
return 0;
}

e=

13, 3 13, 296875


13, 3

100 % = 0, 0235 %

Realice el ejercicio 2

3.4.

Rangos

En un sistema digital los nmeros binarios han de representarse mediante un


nmero jo de bits. Por ejemplo, para transmitir un nmero binario dentro de
un circuito normalmente se usa un conjunto de conductores de forma que cada
uno transporta un bit. Obviamente una vez que se ha fabricado el circuito estos
conductores no pueden ampliarse, por lo que todos los nmeros que se transmitan
usando dichos conductores han de tener el mismo nmero de bits.
La repercusin de tener que reservar de antemano un nmero de bits para
representar los nmeros binarios en un sistema digital es que el rango de valores
que se pueden representar es limitado. Por ejemplo, si se dispone de tres bits, el

3 Sistemas de numeracin

41

rango de nmeros que es posible representar es:


000 0

001 1
010 2
011 3
100 4
101 5
110 6
111 7
En general, es fcil demostrar que el rango de valores que se pueden representar
con n bits es 0 2n 1. As por ejemplo, para tres bits el rango ser 0 23 1
0 7. Esto signica que no se podr representar ningn nmero mayor que 7. Si
se desea representar un nmero mayor ser necesario usar ms bits.

3.5.

Sistemas hexadecimal y octal

Tal como se ha visto en la seccin 3.3, la conversin entre binario y decimal es


relativamente compleja. Por otro lado, trabajar con nmeros binarios no es cmodo
debido a la gran cantidad de dgitos necesarios. Debido a esto se usan en la prctica
otras bases que permiten una fcil conversin a binario y, al necesitar menos dgitos
para representar los nmeros, hacen que su uso sea ms amigable por parte del
hombre. Estas bases son aquellas que sean mltiplos de dos, pues entonces se
puede demostrar que la conversin puede realizarse dividiendo el nmero en grupos
de bits y convirtiendo cada uno por separado, lo cual es ms fcil que convertir el
nmero completo como ocurre en decimal. Las dos bases usadas son la octal (base 8)
y la hexadecimal (base 16).
En el cuadro 3.1 se muestra la equivalencia entre decimal, binario, octal y hexadecimal. Ntese que, tal como se do anteriormente, para la base 8 necesitamos
slo ocho smbolos, por lo que obviamente se han elegido los nmeros de 0 a 7.
Para representar los nmeros en base 16 se necesita tener 16 smbolos. Como se
puede apreciar en el cuadro, se han elegido como smbolos del 0 al 9 y para los seis
restantes, en lugar de inventar garabatos nuevos se han usado las letras de la A a
la F, asignndole los valores mostrados en el cuadro.

3.5.1.

Conversin entre binario y octal

La conversin de binario a octal se realiza agrupando los bits de tres en tres


empezando por el bit menos signicativo5 . Si es necesario se aadirn ceros por la
5
El bit menos signicativo es el que est a la derecha del nmero y el ms signicativo es el
que est a la izquierda.

42

Sistemas de numeracin

Decimal
0
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16

Binario
00000
00001
00010
00011
00100
00101
00110
00111
01000
01001
01010
01011
01100
01101
01110
01111
10000

Octal
00
01
02
03
04
05
06
07
10
11
12
13
14
15
16
17
20

Hexadecimal
0
1
2
3
4
5
6
7
8
9
A
B
C
D
E
F
10

Cuadro 3.1: Equivalencia entre decimal, binario, octal y hexadecimal.

izquierda para completar el ltimo grupo. Una vez agrupados los bits, se convierte
cada grupo por separado. Lo mejor, como siempre, es realizar unos ejemplos:
1001111010012 = 100 111 101 0012 = 47518
11111100002 = 001 111 110 0002 = 17608
La conversin de octal a binario se realiza convirtiendo por separado cada dgito
del nmero octal. Para ello puede ayudarse del cuadro 3.1. Por ejemplo:
47518 = 100 111 101 0012 = 1001111010012

3.5.2.

Conversin entre hexadecimal y binario

La conversin tanto de binario a hexadecimal como de hexadecimal a binario se


realiza de la misma forma que entre binario y octal, salvo que se agrupan los bits
de cuatro en cuatro. As, para convertir de binario a hexadecimal se hace:
1001111001112 = 1001 1110 01112 = 9E716
int main(void)
{
printf("Hola\n");
return 0;
}

Y de hexadecimal a binario:

1CA116 = 0001 1100 1010 00012 = 00011100101000012 = 11100101000012

Realice el ejercicio 3

43

3 Sistemas de numeracin

a i + bi + c i
0 0 0
0 0 1
0 1 0
0 1 1
1 0 0
1 0 1
1 1 0
1 1 1

ci +1
0
0
0
1
0
1
1
1

si
0
1
1
0
1
0
0
1

(a) Tabla de sumar

ai (bi + ci )
0
0
0
0
0
1
0
1
0
0
1
1
1
0
0
1
0
1
1
1
0
1
1
1

ci +1
0
1
1
1
0
0
0
1

(b) Tabla de restar

si
0
1
1
0
1
0
0
1

ai bi
0 0
0 1
1 0
1 1

si
0
0
0
1

(c) Tabla de multiplicar

Cuadro 3.2: Tablas de operaciones en binario

3.5.3.

Conversin de nmeros con parte fraccionaria

Si el nmero binario contiene una parte fraccionaria, para convertirlo a octal o


a hexadecimal los grupos de bits se realizan a partir de la coma binaria. Para la
parte fraccionaria puede ser necesario aadir ceros a la derecha para completar un
grupo. Para ilustrar el mtodo se muestran a continuacin dos ejemplos, uno de
conversin a octal y otro a hexadecimal.
10111011001, 01112 = 010 111 011 001 , 011 1002 = 2731, 348
10111011001, 01112 = 0101 1101 1001 , 01112 = 5D9, 716

3.5.4.

Hexadecimal vs. octal

En la prctica se usa principalmente el sistema hexadecimal frente al octal


debido a que en los ordenadores los bits se agrupan en palabras con un nmero
de bits mltiplo de 4.6 Por ello, cualquiera de estos nmeros se puede convertir a
hexadecimal sin necesidad de aadir ceros por la izquierda.

3.6.

Operaciones matemticas con nmeros binarios

Las operaciones en binario se realizan de la misma forma que en base 10. Es


ms, al disponer slo de los smbolos 0 y 1, las tablas de sumar, restar y multiplicar
son mucho ms simples. El nico problema es que al tener los nmeros un mayor
nmero de cifras las operaciones son ms largas y tediosas.

3.6.1.

Suma de nmeros binarios

Para sumar dos nmeros binarios el procedimiento es el mismo que para sumar
nmeros en base 10: se va sumando dgito a dgito, empezando por los dos dgitos
menos signicativos. Si en la suma se produce un acarreo, ste se suma a los
6

Por ejemplo en un PC se pueden usar nmeros de 8, 16, 32 y 64 bits.

44

Sistemas de numeracin

dos siguientes bits. La tabla usada para realizar la suma es la mostrada en el


cuadro 3.2(a), en donde ai y bi son los dgitos i de cada nmero, ci es el acarreo que
llega a esos dgitos, si es el resultado de la suma para el bit i y ci +1 es el acarreo que
se enva a la cifra siguiente. Para ilustrar el proceso nada mejor que un ejemplo:
1

1 1

01101100
+
01001110
10111010
Para empezar se suman los dos bits menos signicativos: 0 + 0, y el resultado es 0
con acarreo 0. A continuacin se suman los dos siguientes bits: 0 + 1, obtenindose
como resultado un 1 con acarreo 0. Despus se suma 1 + 1 y se obtiene como
resultado 0 con un acarreo de 1, A continuacin se suman los dos siguientes bits
ms el acarreo anterior: 1 + 1 + 1, obtenindose un 1 como resultado y un 1 como
acarreo. Como puede comprobar en el ejemplo el proceso continua as hasta el
ltimo dgito.
Desborde en la suma
En la seccin 3.4 se ha comentado que en un sistema digital el nmero de bits
para representar un nmero binario es jo, por lo que slo puede representarse
un rango de nmeros naturales. Cuando se realiza una suma de dos nmeros el
resultado suele representarse con el mismo nmero de bits que los operandos.7 No
obstante esto presenta un grave problema, ya que el resultado de una suma puede
salirse del rango si ambos sumandos son sucientemente grandes. Por ejemplo el
resultado de sumar 200 + 200 con 8 bits en binario es:
1

11001000
+
11001000
110010000
que como se puede apreciar necesita 9 bits para representarse. Si el resultado
se trunca a 8 bits porque el sistema digital que se est usando es de 8 bits, el
resultado obtenido ser: 100100002 = 144 que no se parece en nada al resultado
real de 400. Por tanto en un sistema digital ha de detectarse cundo se produce un
desbordamiento para no tener en cuenta el resultado.8
7
En la prctica no se realizan operaciones aisladas, sino una serie de clculos en los cuales el
resultado de una operacin se utiliza como operando para la siguiente. Piense por ejemplo en un
programa de ordenador. Si cada vez que se hace una suma hay que aadir un bit para garantizar
que no se desborda el resultado, al nal se acabara con un elevado nmero de bits. Por tanto, lo
ms prctico es usar el mismo nmero de bits para todos los nmeros dentro del sistema digital y
hacer que dicho nmero de bits sea suciente para representar todas las magnitudes con las que
va a trabajar el sistema digital.
8
Esto es lo que ocurre en una calculadora digital: si intenta sumar dos nmeros muy grandes
la calculadora muestra un error en lugar del resultado.

3 Sistemas de numeracin

45

La forma de detectar el desbordamiento en la suma es comprobar si se produce


un acarreo al sumar los dos bits ms signicativos. Si no se produce el resultado es
correcto y si se produce es que ha ocurrido un desbordamiento.

3.6.2.

Resta de nmeros binarios

Al igual que la suma, el algoritmo de la resta es el mismo en binario que en


decimal, slo que ahora se usa la tabla 3.2(b). Al igual que con la suma el proceso
es restar bit a bit empezando por los dos bits menos signicativos. La principal
diferencia con la suma es que el acarreo se le suma al sustraendo9 y dicho resultado
se resta del minuendo. El acarreo se produce tanto si al sumar el bit de acarreo al
bit del sustraendo se produce un acarreo como si el bit del minuendo es un 0 y el
resultado de bi + ci es 1. Ilustremos el proceso con un ejemplo:

01101100
0 110101111 1 0
00011110

En primer lugar se hace la resta 0 0, obtenindose 0 como resultado y 0


como acarreo. Hasta aqu nada interesante. Para la siguiente cifra es necesario
restar 0 1, con lo que se obtiene 1 como resultado y se produce un acarreo a la
siguiente cifra. A continuacin, en primer lugar se suma el acarreo a la cifra del
minuendo, obtenindose un 0 y producindose un acarreo a la siguiente cifra. En
segundo lugar se resta 1 0 producindose 1 como resultado. Alternativamente a
este proceso puede consultarse la tabla 3.2(b) para obtener el resultado de la resta
de 1 1 con acarreo de entrada ci igual a 1 (que es la ltima la de dicha tabla).
Repitiendo este proceso puede comprobar que se obtiene el resultado mostrado en
el ejemplo.
Desborde en la resta
El algoritmo para restar mostrado slo permite realizar la resta cuando el minuendo es mayor que el sustraendo. Por tanto en este caso nunca se producir ningn
error.

3.6.3.

Multiplicacin de nmeros binarios

El algoritmo de la multiplicacin no iba a ser menos: al igual que la suma y la


resta, multiplicar nmeros binarios se realiza de la misma manera que con nmeros
decimales. Adems la tabla de multiplicar es mucho ms sencilla en binario que en
decimal, como se puede ver en 3.2(c). Por ejemplo, la multiplicacin de 1010 por
1101 se realiza:
9
Recuerde que si se hace la operacin a b, al nmero a se le denomina minuendo y al b
sustraendo.

int main(void)
{
printf("Hola\n");
return 0;
}

Realice el ejercicio 4

46

Sistemas de numeracin

0
10
101
1000

1
1
1
0
1
0
0

0
1
0
0
0

10
01
10
0

010

En primer lugar se multiplica el multiplicando por la primera cifra del multiplicador.10 Como es un 1, el resultado es 1010. A continuacin se multiplica el multiplicando por la segunda cifra del multiplicador, escribiendo el resultado desplazado
una cifra a la izquierda. Como en el ejemplo la segunda cifra es un 0, la segunda la
es 0000. El algoritmo continua as hasta llegar a la ltima cifra del multiplicador.
Para terminar se suman los cuatro productos parciales. Como puede observar la
multiplicacin en binario es mucho ms fcil que en decimal, pues al ser las cifras
del multiplicador 0 o 1 los productos parciales son o 0 o el multiplicando.
Desborde en la multiplicacin
Como puede deducirse del algoritmo anterior, si se multiplican dos nmeros de
n bits, el resultado necesita 2 n bits para representarse. Si se trunca el resultado
a n bits se producir un desbordamiento si alguno de los n bits ms signicativos
estn a 1. En el ejemplo anterior se ha realizado la multiplicacin 10 13, obtenindose 130. Como puede observarse se han multiplicado dos nmeros de 4 bits y el
resultado ha necesitado 8 bits para representarse. Si slo se dispusiera de 4 bits
para el resultado, se habra obtenido un 2 como resultado, que obviamente es errneo; lo cual se detecta viendo que hay bits a 1 en los 4 bits ms signicativos del
resultado. Si en cambio se multiplica 7 2:
0
0
0
1
000
0000
0001

int main(void)
{
printf("Hola\n");
return 0;
}

1
0
0
1
0

11
10
00
1

110

no se produce desbordamiento, cuando el resultado se representa con 4 bits.


Realice los ejercicios 5
y6

3.7.

Representacin de nmeros enteros

Para distinguir entre nmeros positivos y negativos, nosotros usamos dos smbolos adicionales: el + para los positivos, omitido normalmente en la prctica, y el
10

En el ejemplo anterior el multiplicando es 1010 y el multiplicador 1101.

3 Sistemas de numeracin

47

para los negativos. En un sistema digital, como se ha dicho anteriormente, slo existen dos smbolos: el 0 y el 1; por lo que es necesario buscar formas de representar
los nmeros negativos sin usar los smbolos + y .

3.7.1.

Representacin de nmeros en signo-magnitud

La primera tcnica que se nos viene a la cabeza para representar nmeros con
signo es usar un bit para representar el signo, asignando el 0 para el + y el 1 para
el . Este bit, al que se denomina bit de signo, se escribe al principio del nmero
binario (bit ms signicativo). As, si se dispone de 4 bits, se reserva el primero para
el signo y los tres restantes para la magnitud. Por ejemplo, el +2 se representar en
este caso como 0010 y el 2 como 1010.
A la vista del ejemplo anterior cabe preguntarse cmo sabe un sistema digital si
la secuencia de bits 1010 es un 2 o un 10. La respuesta es que el sistema digital
no lo sabr nunca, pues no es un ser inteligente. Somos nosotros los encargados de
interpretar cada secuencia de bits sabiendo de antemano cmo estn codicados. En
el ejemplo anterior, sabiendo que la secuencia de bits 1010 representa un nmero en
signo magnitud podremos obtener su valor. Para ello, al ser el bit ms signicativo
un 1 sabemos que es un nmero negativo. Para obtener la magnitud tomamos los
bits restantes (010) y los convertimos a decimal, obteniendo un 2. Por tanto, si la
secuencia de bits 1010 representa un nmero en signo-magnitud, dicho nmero es
el -2.
La desventaja de este sistema de representacin es que es complejo operar con
l, tal como se discute en la seccin 3.9.1. Por ello se han desarrollado otros mtodos
que aunque son menos intuitivos, facilitan mucho las operaciones.

int main(void)
{
printf("Hola\n");
return 0;
}

Realice el ejercicio 7

3.7.2.

Representacin de nmeros en complemento a dos

Esta tcnica es la ms usada en la prctica, pues como se ver ms adelante simplica las operaciones matemticas entre nmeros con signo. Esta representacin
se basa en obtener el complemento a dos de los nmeros negativos, por lo que antes
de empezar conviene mostrar cmo se obtiene el complemento a dos de un nmero.
Complemento a dos
Para obtener el complemento a dos de un nmero binario existen dos algoritmos:
El primero consiste en invertir todos los bits del nmero binario y sumar uno
al resultado. Por ejemplo, para obtener el complemento a dos de 0110, en
primer lugar se invierten todos los bits:
0110
1001
Al resultado obtenido se le suma 1:

48

Sistemas de numeracin

1001
+
0001
1010
El segundo mtodo es mucho ms fcil y consiste en copiar cada bit del
nmero de derecha a izquierda hasta que se encuentre el primer 1. A partir de ese momento se copia el inverso de cada bit. En el ejemplo anterior,
para obtener el complemento de 0110, se empieza copiando el nmero hasta
encontrar el primer 1, con lo que en ese momento habremos escrito:
0110
10
El resto de bits se copian invertidos, obteniendo al nal el complemento a dos
del nmero:
0110
1010
Ambos algoritmos son sencillos de realizar, pero quizs el lector no entienda en
realidad qu es lo que se est haciendo. Pues bien, obtener el complemento a dos
de un nmero x no es ms que calcular 2n x en donde n es el nmero de bits del
nmero x. Por ejemplo, para obtener el complemento a dos del nmero de 4 bits
0110 hay que hacer la siguiente operacin:

10000
10
01010

101011

Lo que ocurre es que la resta anterior es difcil de hacer, tanto para nosotros como para nuestros queridos circuitos digitales. Ahora bien, teniendo en cuenta que
10000 = 1111 + 1, la anterior operacin se puede descomponer en 1111 0110 + 1.
La ventaja de hacer esta operacin as es que, tal como se aprecia en el ejemplo:

1111
0110
1001

restar 1111 0110 es equivalente a invertir los bits del sustraendo. Esto es cierto
siempre que el minuendo sea todo unos, pues no se producen acarreos entre cifras
y 1 0 = 1 y 1 1 = 0.
Para terminar de calcular el complemento a dos se suma 1 al resultado anterior:
1

1001
+
0001
1010

3 Sistemas de numeracin

49

En denitiva, con este truco hemos conseguido realizar la operacin 2n x invirtiendo


todos los bits y sumando 1 en lugar de hacer una resta.
Representacin de nmeros enteros en complemento a dos
Para representar un nmero entero en complemento a dos se sigue el siguiente
algoritmo:
Si el nmero es positivo, se representa en binario. En este caso el nmero de
bits usados para representar el nmero ha de ser suciente para que el bit
ms signicativo sea un 0.
Si el nmero es negativo se obtiene el complemento a dos del valor absoluto
del nmero. En este caso el nmero de bits usados para representar el nmero
ha de ser suciente para que el bit ms signicativo sea un 1.
En ambos casos, al igual que en los nmeros representados en signo-magnitud, al
bit ms signicativo se le denomina bit de signo y es 0 cuando el nmero es positivo
y 1 cuando es negativo.
Lo mejor como siempre es ver un ejemplo:
Representar los siguientes nmeros en complemento a dos usando 4 bits:
+3. Como es positivo se representa en binario sin ms. Por tanto +3 se representa en complemento a 2 como 0011C2 .11
-3. Como es negativo, ha de obtenerse el complemento a 2 de su mdulo. Por
tanto es necesario obtener el complemento a 2 de 00112 , que es 1101C2 . As
pues -3 se representa en complemento a 2 como 1101C2 .
A veces es frecuente tener que realizar el proceso inverso, es decir, a partir de
una representacin en complemento a dos de un nmero, obtener su valor. Para ello
basta con seguir el algoritmo presentado antes a la inversa. Para ilustrar el proceso
nada mejor que realizar el siguiente ejercicio:
Ejercicio
Imagnese que est depurando un programa y en la memoria del ordenador lee
dos posiciones de memoria en las que sabe que hay almacenados dos nmeros en
complemento a dos. Si los nmeros en cuestin son:
00001011C2
11111011C2
De qu nmeros se trata?
Para obtener el nmero entero representado por cada secuencia de bits, en
primer lugar hay que averiguar si el nmero es positivo o negativo. Esto viene dado
por el bit ms signicativo (bit de signo). Si dicho bit es un 0 el nmero es positivo,
y si es un 1 es negativo. Si el nmero es positivo basta con convertir el nmero
11
En este libro, a los nmeros representados en complemento a dos se les pondr un C2 como
subndice.

50

Sistemas de numeracin

binario a decimal. As, como el primer nmero del ejemplo tiene el bit de signo a 0,
ste es positivo y por tanto se trata del:
00001011C2 = 0 27 + 0 26 + 0 25 + 0 24 + 1 23 + 0 22 + 1 21 + 1 20 = 11
En cambio el segundo nmero tiene el bit de signo a 1, por lo que en primer
lugar hay que obtener su complemento a dos:
11111011
00000101

int main(void)
{
printf("Hola\n");
return 0;
}

El resultado anterior es el valor absoluto del nmero en binario, por lo que hay que
convertirlo a decimal:
000001012 = 0 27 + 0 26 + 0 25 + 0 24 + 0 23 + 1 22 + 0 21 + 1 20 = 5
Por tanto el nmero 11111011C2 es el 5.

Realice los ejercicios 8


y9

Todo esto est muy bien, pero. . . Qu estamos haciendo?


La mecnica expuesta para representar nmeros en complemento a dos puede
parecer sin sentido, pero al contrario es una idea genial. Lo que se persigue con esta
notacin es facilitar la realizacin de sumas con nmeros enteros. Como se ha dicho
antes, en complemento a dos un nmero negativo x se representa como 2n x.
Para que la notacin funcione, si se hace la operacin x + (x ) el resultado ha de
ser cero. En la representacin en complemento a dos esta operacin se traduce en:
x + (2n x ) = 2n

(3.1)

Pero 2n equivale a 0 si las operaciones se realizan con nmeros de n bits y no se


tiene en cuenta el acarreo. Por ejemplo, si x = 0010C2 , la operacin anterior ser,
teniendo en cuenta que 2 en complemento a dos se representa como 1110C2 :
1 1

0010
+
1110
10000
Pero como tanto los operandos como el resultado son nmeros son de 4 bits y no
tenemos en cuenta el acarreo nal, el resultado de la operacin anterior es 0000C2 ,
como debe ser. Ntese que en esta operacin el acarreo nal no indica desborde, tal
como ocurre en la suma sin signo mostrada en la seccin 3.6.1. En la seccin 3.9.2
se muestra cmo detectar el desbordamiento cuando se suman nmeros con signo
representados en complemento a dos.

51

3 Sistemas de numeracin

3.7.3.

Representacin de nmeros en exceso

Otra tcnica usada en la prctica para representar nmeros enteros consiste en


sumar a todos los nmeros una cantidad ja y representar en binario el resultado.
La cantidad ja, denominada exceso o sesgo, puede ser o bien 2n 1 o bien 2n 1 1,
en donde n es el nmero de bits usados para representar el nmero. En la prctica
este tipo de representacin se usa para los exponentes de los nmeros en coma
otante, usndose como exceso el valor 2n 1 1.
Veamos algunos ejemplos con nmeros de 8 bits tomando como exceso el valor:
2n 1 1 = 27 1 = 127 :
27: 27 + 127 = 154. Convirtiendo 154 a binario se obtiene:

154

77
1

2
38
0

2
19

y por tanto 27 en exceso 127 se representa como: 10011010XS127 .12


-27: 27 + 127 = 100. Convirtiendo 100 a binario se obtiene 11001002 . Por
tanto -27 en exceso 127 se representa como: 01100100XS127 . Ntese que
se ha aadido un 0 a la izquierda para obtener los 8 bits requeridos en la
representacin.
-128: 128 + 127 = 1. Como 1 no puede representarse en binario, pues en
binario puro slo se pueden representar nmeros naturales, -128 no puede
representarse en exceso 127.

3.8.

Rangos en los nmeros con signo

El rango disponible para representar nmeros con signo se reparte ms o menos


de igual forma para los nmeros positivos y para los nmeros negativos, aunque
con ligeras diferencias en funcin del mtodo usado para representarlos. As, es fcil
demostrar que el rango para n bits es igual a:

2n 1 1 2n 1 1 para nmeros codicados en signo-magnitud.


2n 1 2n 1 1 para nmeros codicados en complemento a dos.
2n 1 1 2n 1 para nmeros codicados en exceso 2n 1 1.

12
En este libro, a los nmeros representados en exceso 127 se les pondr XS 127 como subndice.

int main(void)
{
printf("Hola\n");
return 0;
}

Realice el ejercicio 10

52

3.9.

Sistemas de numeracin

Operaciones matemticas con nmeros con signo

Las operaciones descritas en el apartado 3.6 slo son vlidas para nmeros
binarios naturales (sin signo). Para realizar operaciones de nmeros enteros es
necesario modicar los algoritmos segn el tipo de codicacin usada.

3.9.1.

Operaciones con nmeros en signo-magnitud

Para realizar una suma de dos nmeros en signo-magnitud es necesario estudiar


en primer lugar los signos de ambos nmeros y a continuacin hacer una suma o
una resta en funcin de stos. Por ejemplo si se desea hacer la siguiente operacin
entre dos nmeros codicados en signo-magnitud con 4 bits:
0011 + 1010

(3.2)

En primer lugar se observa que el segundo nmero es negativo (2), por lo que la
operacin a realizar ser:
(3.3)
0011 0010 = 0001

Para realizar una resta el proceso es el mismo, por lo que no merece la pena emplear ms tiempo en ello. Para multiplicar dos nmeros el proceso es similar: se
multiplican las magnitudes y el signo resultante se obtiene estudiando el signo de
los operandos.
Aunque esta forma de operar no es complicada para nosotros, si lo es para un
circuito. Por ello, tal como se mencion en la seccin 3.7.1, los nmeros codicados
en signo-magnitud prcticamente no se usan en la prctica.

3.9.2.

Operaciones con nmeros en complemento a dos

La notacin en complemento a dos se desarroll precisamente para simplicar


las operaciones con nmeros enteros. Como se ha mostrado en la seccin 3.7.2,
para sumar nmeros codicados en complemento a dos se sigue el algoritmo de
suma en binario y se desprecia el acarreo nal cuando se produce. Por ejemplo, la
suma 27 + (36) con nmeros de 8 bits es:
1 1

00011011
+
11011100
11110111
Y el resultado, teniendo en cuenta que es un nmero representado en complemento
a dos, es 9, tal como era de esperar.
Otra de las ventajas de usar nmeros en complemento a dos es que las restas se
pueden hacer sumando el sustraendo cambiado de signo, no siendo necesario usar
el algoritmo de resta que tan difcil suele resultar de aplicar. Es decir, suplantamos
el algoritmo de resta por el de obtener el complemento a dos (muy fcil) y el de sumar
(ms fcil que el de restar). Esta simplicacin no solo es buena para nosotros, sino

3 Sistemas de numeracin

53

que tambin lo es para los circuitos digitales, tal como veremos ms adelante. Por
ejemplo, para restar 00001111 00000110, lo que en realidad hacemos es:
1. Obtenemos el complemento a dos del sustraendo: 11111010C2
2. Sumamos el minuendo ms el sustraendo:
1 1 1 1 1 1

00001111
+
11111010
100001001
3. Despreciamos el acarreo nal, con lo que el resultado es 00001001C2 , que es
9, como era de esperar despus de restar 15 6.
Desborde en la suma en complemento a dos
Al igual que en la suma sin signo, si los nmeros a sumar son demasiado
grandes puede ocurrir que el resultado no pueda representarse con el nmero de bits
nito usado para representarlo. Por ello despus de realizar una suma es necesario
vericar si se ha producido un desbordamiento para marcar el resultado como
errneo. Existen dos formas de evaluarlo, que como siempre es mejor discutir con
un ejemplo: realicemos la suma de 103 + 103 en complemento a dos usando 8 bits:
1 1

1 1 1

01100111
+
01100111
11001110
El resultado obtenido es 11001110C2 , que en decimal es 50 en lugar de 206, lo
cual es una prueba de que algo no ha ido bien con la suma. El problema es que un
sistema digital no es capaz de darse cuenta de este tipo de error si no buscamos
una forma fcil de averiguarlo. Existen dos maneras:
Si el signo de ambos sumandos es el mismo y el del resultado es distinto
se ha producido un desbordamiento. Obviamente si despus de sumar dos
nmeros positivos obtenemos uno negativo es seal de que algo no ha ido
bien. De la misma forma si sumamos dos nmeros negativos el resultado ha
de ser otro nmero negativo y si nos sale positivo ms vale que lo tiremos a
la basura. Si el signo de ambos sumandos es distinto obviamente el resultado
ser menor que ambos sumandos, por lo que es imposible que se produzca
un desbordamiento.
Otra alternativa para detectar el desbordamiento es analizar los dos ltimos
acarreos. Si son iguales es seal de que ha ido todo bien, pero si son distintos
es que ha ocurrido un desbordamiento. Si volvemos al ejemplo anterior:
0 1 1

Dos u
ltimos acarreos.
1 1 1

01100111
01100111
11001110

54

Sistemas de numeracin

Vemos que los dos ltimos acarreos son distintos, lo que indica que se ha producido
un desbordamiento y por tanto el resultado no es correcto. Si en cambio se realiza
la suma 103 + (2):
Dos ultimos

acarreos.
1 1 1 1 1

int main(void)
{
printf("Hola\n");
return 0;
}

10011001
11111110
110010111

Los dos ltimos acarreos son iguales y por tanto el resultado es correcto, lo cual
puede comprobar usted mismo convirtiendo el resultado a decimal.
Realice el ejercicio 11

3.9.3.

Extensin del signo

En ocasiones es necesario aumentar el nmero de bits con el que se representa


un nmero para extender su rango. En este caso, si el nmero es sin signo basta
con aadir ceros por la izquierda hasta completar el nmero de bits. Por ejemplo
si tenemos el nmero 7 representado con 4 bits (0111) y queremos representarlo
con 8 bits, basta con aadir cuatro ceros por la izquierda (0000 0111). Como puede
comprobar fcilmente, el nmero resultante sigue siendo el 7.
Si queremos aumentar el nmero de bits de un nmero con signo representado
en complemento a 2, el proceso es ligeramente distinto. Si el nmero es positivo, basta con aadir ceros por la izquierda, tal como acabamos de hacer con los
nmeros sin signo. Si el nmero es negativo la cosa cambia. Si partimos de un
nmero cualquiera, como por ejemplo el -2 expresado con 4 bits (1110) y queremos
expresarlo con 8 bits; vemos que si aadimos ceros por la izquierda obtenemos el
nmero 0000 1110, que es el 14. Si por el contrario aadimos unos por la izquierda
obtenemos el nmero 1111 1110, que como puede comprobar es el nmero -2.
Resumiendo, para aumentar el nmero de bits de un nmero en complemento
a 2 basta con extender por la izquierda el bit de signo hasta completar el nmero
de bits deseado. A este proceso se le conoce como extensin de signo.
Veamos algunos ejemplos:
0110 a 8 bits: 0000 0110
1101 a 16 bits: 1111 1111 1111 1101

3.9.4.

Multiplicacin de nmeros en complemento a 2

Al igual que con la suma, el algoritmo de multiplicacin tambin es vlido con


nmeros en complemento a dos. No obstante antes de realizar la multiplicacin es
necesario extender el signo de ambos nmeros para que las sumas intermedias se
realicen siempre con el nmero de bits del resultado (que recuerde que es la suma de
los nmeros de bits de ambos operandos). Una vez realizada la multiplicacin slo
se tienen en cuenta los bits menos signicativos del resultado. Lo mejor es mostrar
un ejemplo: si se desea multiplicar 2 5, estando ambos representados con 4

55

3 Sistemas de numeracin

bits; el punto de partida es 1110C2 0101C2 . Como el resultado ha de expresarse


con 8 bits, es necesario extender el signo de ambos operandos antes de realizar la
multiplicacin:

0
00
000
000

0
0
0
0
0

0
0
0
0
0
1

1
0
0
0
0
0
0

0
1
0
0
0
0
0
0

1
0
1
0
1
0
0
0
0
0
1

1
0
1
0
1
0
0
0
0

1
0
1
0
1
0
0
0

1
0
1
0
1
0
0

1
0
1
0
1
0

1
1
1
0
0

10
01
10
0

1110110

Del resultado de la multiplicacin anterior slo se toman los 8 bits menos signicativos, obtenindose entonces 11110110C2 , que como puede comprobar es -10.
Desborde en la multiplicacin de nmeros en complemento a 2
Al igual que con la multiplicacin de nmeros naturales, si el resultado se expresa con n + m bits, siendo n y m el nmero de bits del multiplicando y el multiplicador;
no se producir ningn desbordamiento. Si se desea truncar el nmero de bits del
resultado, habr que vericar que el resultado est dentro del rango. Para ello basta con vericar que los bits que se eliminan del resultado son todos iguales al bit
de signo del nmero resultante. En el ejemplo anterior, si queremos expresar el
resultado original (11110110C2 ) con 4 bits vemos que los 4 bits que se eliminan
(1111) aunque iguales entre s son distintos al bit de signo del nmero resultante
(0110C2 ). Por tanto se produce un desbordamiento, lo cual es fcil de comprobar,
ya que 0110C2 es 6, en lugar de -10.
Si por ejemplo se realiza la multiplicacin de 2 3 con 4 bits:

0
00
000
000

0
0
0
0
0

0
0
0
0
0
0

0
0
0
0
0
0
1

1
0
0
0
0
0
0
0

1
0
1
1
0
0
0
0
0
0
1

1
0
1
1
0
0
0
0
0

1
0
1
1
0
0
0
0

1
0
1
1
0
0
0

1
0
1
1
0
0

1
0
1
1
0

10
11
10
0

1111010

56

int main(void)
{
printf("Hola\n");
return 0;
}

Sistemas de numeracin

El resultado en 8 bits es 11111010C2 , que en este caso se puede truncar a 4 bits,


ya que los cuatro bits ms signicativos coinciden con el bit de signo del nmero
truncado. El resultado es 1010C2 que como puede comprobar es -6.

3.10.
Realice el ejercicio 12

Otros cdigos binarios

A la hora de representar un nmero en binario lo primero que se nos viene a


la cabeza es representar dicho nmero en base 2, tal como hemos hecho en las
secciones anteriores. No obstante existen otros mtodos para codicar nmeros en
binario que presentan ciertas ventajas.

3.10.1.

Cdigos BCD

La dicultad de convertir un nmero decimal a uno binario viene porque es


necesario convertir el nmero como un todo, tal como hemos visto en la seccin 3.3.
Para facilitar la conversin, en los nmeros en BCD se codica cada uno de sus
dgitos por separado. De ah viene precisamente el nombre de BCD, que son las
siglas del ingls Binary Coded Decimal o Decimal Codicado en Binario.
As pues, para codicar un nmero en BCD se codica en binario cada uno de
los dgitos decimales que forman el nmero. As, para codicar el nmero 127, lo
que hacemos es codicar por un lado el 1, luego el 2 y luego el 7. Como en el sistema
decimal tenemos 10 smbolos (del 0 al 9), son necesarios 4 bits para codicarlos.
El problema es que con 4 bits tenemos 16 posibles combinaciones, de las cuales
slo vamos a usar 10. Esto hace que en total se puedan hacer 2, 9 1010 posibles
asignaciones entre el cdigo binario y el dgito decimal.13 Afortunadamente en la
prctica slo se usan tres asignaciones, las cuales se muestran en el cuadro 3.3
En BCD natural se codica cada dgito segn su valor binario. El resto de cdigos
binarios (del 1010 al 1111) no se usan y por eso se han marcado con un guin en el
cuadro. En el cdigo Aiken los cinco primeros dgitos decimales se codican segn
su valor, pero los otros 5 se codican sumndole 6. Esto permite que la asignacin
de cdigos binarios sea simtrica y facilita la operacin matemtica del complemento
a 10, usada para representar nmeros negativos al igual que el complemento a 2 de
los nmeros binarios. El cdigo XS-3 consigue la misma simetra que el Aiken pero
sumando 3 a todos los valores.
Para ilustrar el proceso de codicacin, nada mejor que ver algunos ejemplos:
Codicar 127 en BCD Natural, BCD Aiken y BCD XS-3. Usando el cuadro 3.3
codicamos cada dgito por separado:

BCD Natural: 0001 0010 0111.


BCD Aiken: 0001 0010 1101.
BCD XS-3: 0100 0101 1010.
13
Las posibles asignaciones se calculan como las variaciones de 16 elementos tomados de 10 en
10, que vienen dadas por la frmula 16!/(16 10)!

57

3 Sistemas de numeracin

B3 B2 B1 B0
0
0
0
0
0
0
0
0
1
1
1
1
1
1
1
1

0
0
0
0
1
1
1
1
0
0
0
0
1
1
1
1

0
0
1
1
0
0
1
1
0
0
1
1
0
0
1
1

0
1
0
1
0
1
0
1
0
1
0
1
0
1
0
1

BCD Natural
0
1
2
3
4
5
6
7
8
9

BCD Aiken
0
1
2
3
4

5
6
7
8
9

BCD XS-3

0
1
2
3
4
5
6
7
8
9

Cuadro 3.3: Cdigos BCD

Convertir los siguientes nmeros BCD a decimal. El proceso a seguir es el inverso del ejemplo anterior, teniendo en cuenta qu cdigo BCD usa el nmero:

1001 0110 0011, teniendo en cuenta que est codicado en BCD Natural:
963.

0100 1011, teniendo en cuenta que est codicado en BCD Aiken: 45

int main(void)
{
printf("Hola\n");
return 0;
}

0100 1000 1100 1011, teniendo en cuenta que est codicado en BCD
XS-3: 1598

Nmeros BCD con signo


En BCD los nmeros con signo se representan en la prctica o en signo magnitud
o en complemento a 10. Ambos mtodos son similares a los expuestos para nmeros
binarios.

Signo magnitud
Al igual que en binario, se reserva el dgito ms signicativo para el signo (0001
para y 0000 para +). As, el nmero +27 se representa en BCD natural como 0000
0010 0111 y el -27 como 0001 0010 0111.

Realice los ejercicios 13 y 14

58

Sistemas de numeracin

Complemento a 10
El complemento a 10 de un nmero x se calcula del mismo modo que el complemento a 2 de los nmeros binarios: 10n x, siendo n el nmero de dgitos del
nmero x. Por ejemplo el complemento a 10 del nmero 127 se calcula como:

1000
127
873

Por tanto, el complemento a 10 del nmero BCD natural 0001 0010 0111 es el 1000
0111 0011.
Para codicar nmeros enteros en BCD usando complemento a 10 el proceso es
el mismo al seguido con los nmeros binarios:
Si el nmero es positivo, se codica dicho nmero en BCD. En este caso hay
que asegurarse que el dgito mas signicativo sea menor que 5.
Si el nmero es negativo, se codica en BCD el complemento a 10 del nmero.
En este caso el dgito ms signicativo ha de ser mayor o igual que 5.

int main(void)
{
printf("Hola\n");
return 0;
}

Realice los ejercicios 15 y 16

Por ejemplo, si queremos codicar el nmero +27 en BCD natural usando dos
dgitos, como es positivo, se codica tal cual: 0010 0111. Al ser el dgito ms signicativo menor que 5 es seal de que el resultado es correcto.
Para codicar el nmero -27 en BCD natural usando dos dgitos, como es negativo, es necesario codicar su complemento a 10, que es 100 27 = 73. Por tanto
-27 se codica como 0111 0011. Nuevamente, como el dgito ms signicativo es
mayor que cinco, el resultado es correcto.
Si nos dan un nmero entero en BCD codicado en complemento a 10 y queremos saber de qu nmero se trata, basta con realizar el algoritmo anterior a la
inversa, tal como hicimos con los nmeros binarios en complemento a 2.
En conclusin, como ha podido observar, el complemento a 10 en los nmeros
BCD es igual que el complemento a 2 en los nmeros binarios.
Suma de nmeros en BCD
El algoritmo para sumar nmeros en BCD es ligeramente distinto al usado para
sumar nmeros en binario. Adems dicho algoritmo vara en funcin del cdigo BCD
usado. Para sumar nmeros codicados en BCD natural o BCD Aiken, el algoritmo
es el siguiente:
Se suma el nmero dgito a dgito.
Para cada dgito, si el resultado es un cdigo invlido (los marcados con un
guin en la tabla 3.3) o si se produce un acarreo a la siguiente cifra, hay que
sumar 6 al resultado anterior.
Para ilustrar el proceso nada mejor que mostrar un ejemplo. A continuacin se
realiza la suma 197 + 385 = 582 en BCD natural:

59

3 Sistemas de numeracin

0011

0011

0001
0011
0101

1001
1000
0010
0110
1000

1110

0111
0101
1100
0110
0010

La suma del primer dgito da como resultado 1100, que como puede apreciar en
la tabla 3.3 es un cdigo invlido. Por tanto se ha sumado 6 al resultado (se han
omitido los acarreos intermedios para no complicar la gura) para obtener un 2,
que es el resultado esperado. Ntese que como resultado de esta ltima suma se
produce un acarreo al siguiente dgito, el cual ha de tenerse en cuenta. La suma del
segundo dgito da como resultado 0010, que es un cdigo vlido, pero como se ha
producido un acarreo al siguiente dgito, es necesario sumar 6 al resultado anterior;
obteniendo un 8 que de nuevo es el resultado esperado. Por ltimo, en la tercera
cifra el resultado es 0101 que al ser un cdigo vlido y al no haberse producido
acarreo a la siguiente cifra no hace falta realizarle ningn ajuste.
El algoritmo para nmeros BCD XS-3 es ligeramente distinto y un poco ms
complejo al tener que realizar restas:
Se suma el nmero dgito a dgito.
Para cada dgito, si hay acarreo a la siguiente cifra se suma 3. Si no hay
acarreo a la siguiente cifra se resta 3.
Por ejemplo, la suma 197 + 485 = 682 en BCD XS-3 se realiza:
1111

0100
0111
1100
0011
1001

1111

1100
1011
1000
0011
1011

0000

1010
1000
0010
0011
0101

Como puede observar, en los dos primeros dgitos la suma ha producido un acarreo
a la siguiente cifra, por lo que se ha sumado 3 al resultado. Por el contrario, en
el ltimo dgito no se ha producido ningn acarreo, por lo que se ha restado 3 al
resultado. El nmero nal ha sido 1001 1011 0101, que si lo convierte a decimal
obtendr 682, como era de esperar.

3.10.2.

Cdigo Gray

La caracterstica del cdigo Gray es que entre dos nmeros consecutivos slo
cambia un bit. Si se ja en los diagramas de Karnaugh, las las y columnas estn
numeradas segn este cdigo (00, 01, 11 y 10) para conseguir que entre casillas
adyacentes slo diera un bit. La otra aplicacin prctica de los nmeros en cdigo
Gray son los codicadores angulares. Estos dispositivos permiten medir ngulos
mediante unos sensores luminosos y una rueda codicada segn el cdigo Gray,

int main(void)
{
printf("Hola\n");
return 0;
}

Realice el ejercicio 17

60

Sistemas de numeracin

Figura 3.1: Codicador angular.

tal como se muestra en la gura 3.1. El funcionamiento de estos dispositivos es el


siguiente: unos diodos led (light-sources en la gura) iluminan un disco dividido en
sectores, cada uno de los cuales tiene impreso un nmero Gray (0 blanco, 1 negro).
El disco por tanto dejar pasar la luz slo en los puntos que estn en blanco, los
cuales sern detectados por unos fototransistores (photo-elements en la gura). La
salida de estos fototransistores ser por tanto el nmero impreso en el disco en
el sector que est frente a los detectores. El codicar los sectores en cdigo Gray
permite que cuando el disco est entre un sector y el siguiente no se produzcan
errores en la lectura, ya que slo cambiar un bit. Si por el contrario el disco
se codicase en binario, existiran sectores consecutivos entre los que cambiaran
varios bits. En ese caso, al pasar se un sector a otro, como es imposible que cambien
varios bits a la vez, pasaremos por valores errneos. Por ejemplo, si el disco estuviese
codicado con tres bits, al pasar por ejemplo del sector 011 al 100 puede ocurrir
que primero cambie el bit 2 y leamos el cdigo 111, luego el bit 0 y leamos el cdigo
110 y por ltimo cambie el bit 1 para obtener el ngulo correcto 100. Si en cambio
el disco est codicado en Gray, del 011 pasaremos al nmero 010 y como slo
cambia el bit 0 no podemos pasar por valores intermedios errneos.

Conversin entre binario y cdigo Gray


El algoritmo para convertir un nmero binario a Gray es bien sencillo:
El bit ms signicativo del nmero en cdigo Gray coincide con el del nmero
binario.
Para el resto de bits, el bit i del nmero en cdigo Gray es igual a la XOR entre
los bits i e i + 1 del nmero binario.

3 Sistemas de numeracin

61

Por ejemplo, para el nmero binario b3 b2 b1 b0 el nmero en cdigo Gray g3 g2 g1 g0


se calcula como:
g3 = b3
g2 = b3 b2
g1 = b2 b1
g0 = b1 b0
Por ejemplo, el nmero binario 0100 se codica en cdigo Gray como 0110.
El algoritmo para convertir de Gray a binario es tambin muy simple:
El bit ms signicativo del nmero binario coincide con el del nmero en
cdigo Gray.
Para el resto de bits, si el bit i del nmero en cdigo Gray es 1, el bit i del
nmero binario es el bit i + 1 del nmero binario negado. Si por el contrario el
bit i del nmero en cdigo Gray es 0, el bit i del nmero binario es el bit i + 1
del nmero binario sin negar.
El algoritmo anterior es en realidad una forma prctica de calcular una serie
de operaciones XOR encadenadas. As, la expresin matemtica para convertir el
nmero en cdigo Gray g3 g2 g1 g0 a el nmero binario b3 b2 b1 b0 es:
b3 = g 3
b2 = g3 g2

b1 = g3 g2 g1

int main(void)
{
printf("Hola\n");
return 0;
}

b0 = g3 g2 g1 g0
As, el nmero en cdigo Gray 0110 se codica en binario como 0100.

3.11.

Ejercicios

1. Convierta los siguientes nmeros de binario a decimal:


100111012
111010002
101, 10112
1101, 0012
2. Convierta el nmero 23,57 a binario usando 6 bits para la parte decimal.
Calcule tambin el error de cuantizacin cometido.
3. Convierta el nmero 1001010111101, 012 a hexadecimal y a octal.
4. Realice las siguientes operaciones en binario usando 8 bits: 78 + 76, 78 + 200,
78 60.

5. Justique el algoritmo de multiplicacin expuesto en la seccin 3.6.3. Para


ello tenga en cuenta la denicin de un sistema de numeracin posicional
expuesto en la seccin 3.2.

Realice el ejercicio 18

62

Sistemas de numeracin

6. Multiplique 14 11 en binario usando nmeros de 4 bits. Es posible representar el resultado tambin con 4 bits?
7. Represente +77 y -77 en binario signo-magnitud usando 8 bits.
8. Represente los nmeros +77, -77, +128 y -128 en complemento a 2 usando
8 bits.
9. Si las siguientes secuencias de bits representan nmeros en complemento a 2, qu nmeros representan?: 00100110C2 , 10010111C2 , 11111111C2 ,
01010111C2 .
10. Codique +28 y -28 con 8 bits usando signo-magnitud, complemento a 2 y
XS-127.
11. Realice las siguientes operaciones, indicando cundo el resultado es correcto y cundo se produce un desbordamiento. Todas las operaciones son con
nmeros codicados en complemento a dos de 4 bits:
a) 1001C2 + 0111C2
b) 0101C2 + 1111C2
c) 0111C2 + 0001C2
d) 1100C2 + 1011C2
12. Realice las siguientes multiplicaciones usando nmeros en complemento a 2
de 4 bits. Indique cuando el resultado puede expresarse slo con 4 bits.
a) 1001C2 0111C2
b) 0101C2 1111C2
c) 0111C2 0010C2

d) 1110C2 0011C2

13. Convierta los siguientes nmeros a BCD Natural, BCD Aiken y BCD XS-3:
a) 1267
b) 45
c) 3987
14. Convierta los siguientes nmeros de BCD a decimal.
a) 0001 1000 1001 0110, sabiendo que est codicado en BCD Natural.
b) 0011 1100 1110 0000, sabiendo que est codicado en BCD Aiken.
c) 0100 0111 1100 0011, sabiendo que est codicado en BCD XS-3.
15. Codique los siguientes nmeros enteros en BCD natural en complemento a
10 usando nmeros de 4 dgitos:
a) 1267
b) 45
c) -3987
d) -5678

3 Sistemas de numeracin

63

16. Las siguientes secuencias de bits son nmeros enteros codicados en BCD
natural en complemento a 10. Indique qu numero decimal representan.
a) 0001 1000 1001 0110.
b) 0111 0000 0110 0010.
17. Realice la suma 398 + 582 en BCD natural. Para ello convierta ambos sumandos a BCD natural y realice la suma aplicando el algoritmo mostrado en la
seccin 3.10.1, indicando los acarreos intermedios. Repita el ejercicio codicando ambos nmeros en BCD XS-3.
18. Convierta el nmero 1001 de cdigo Gray a binario y el nmero 0111 de
binario a cdigo Gray.

Vous aimerez peut-être aussi