LibroMOOCCodInfo PDF
LibroMOOCCodInfo PDF
LibroMOOCCodInfo PDF
informática:
Codificación de la
información
Raúl Montoliu Colás
Joaquín Torres Sospedra
Introducción a la informatica. Codificación de la información
por Raúl Montoliu Colás y Joaquín Torres Sospedra
se distribuye bajo una Licencia Creative Commons Atribución-CompartirIgual 4.0
Internacional
http://creativecommons.org/licenses/by-sa/4.0/.
Abril 2015
Índice general
8 Referencias bibliográficas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81
Bibliografía 81
Prólogo
Capítulo 6 trata sobre la codificación de números reales. Por último, el Capítulo 7 está
dedicado a explicar la codificación de caracteres alfanuméricos.
A lo largo del libro el lector podrá encontrar multitud de ejemplos así como ejercicios
cuya resolución será de utilidad para mejorar la compresión de los conceptos explicados.
La solución a todos los ejercicios planteados se pueden consultar al final de cada capítulo.
Para la realización de este libro se ha usado una plantilla de LaTex parcialmente
modificada de la realizada por Mathias Legrand y que se puede descargar en:
http://www.latextemplates.com/template/the-legrand-orange-book.
La imagen de cabecera de cada capítulo es una alteración de una imagen cuyo
original se puede descargar en este enlace:
http://pixabay.com/es/sistema-binario-binaria-63526/.
El sistema de numeración decimal
Sistemas de numeración posicionales
Conversión de cualquier base a de-
cimal
Rango de cantidades expresables
Tri: Un sistema de numeración inven-
tado de base 3
Bits y bytes
Solución a los ejercicios propuestos
Figura 1.1: Ejemplo de como se forma en decimal las cantidades ocho y nueve. Para la
cantidad diez no existe un nuevo símbolo que podamos usar, por lo tanto reutilizamos
los símbolos existentes en el dígito más a la derecha y usamos el siguiente en el de su
izquierda.
Por lo tanto, diez → 001010 . La Figura 1.1 muestra de forma esquemática este proceso.
Continuando con esta estrategia, llegaríamos a la cantidad nueve mil novecientos
noventa y nueve como sigue: nueve mil novecientos noventa y nueve → 999910 . ¿Cómo
expresamos la siguiente cantidad (es decir, diez mil)?. De acuerdo a la estrategia comen-
tada, es evidente que se debería expresar de la siguiente forma: diez mil → 10 00010 . Sin
embargo, solo tenemos 4 dígitos (N = 4) y por lo tanto, no podemos representar cantida-
des superiores a nueve mil novecientos noventa y nueve pues necesitan más de 4 dígitos.
Por lo tanto, con N = 4 la cantidad mayor que se puede expresar es 104 − 1 = 9999.
El número máximo de cantidades que se puede expresar en el sistema decimal con
N dígitos es: 10N . Las cantidades estarán en el rango [0, 10N − 1]. El rango anterior se
puede escribir también como [0, 10N ).
Definición 1.1.2 — Rango. En lenguaje matemático, un rango es una forma de
expresar el conjunto de todas las cantidades posibles comprendidas entre dos dadas.
Para expresar un rango podemos usar los símbolos ‘[’ y ‘]’ o los símbolos ‘(’ y ‘)’.
En el primero de los casos, los números que definen el rango forman parte del mismo.
En el segundo caso, estos números no forman parte del rango. Por ejemplo, [1, 4] es
1.2 Sistemas de numeración posicionales 11
0
xb [p] ∗ b p
X
x10 = (1.1)
p=N−1
12 Capítulo 1. Introducción a los sistemas de numeración
donde xb [p] es el valor decimal asociado al símbolo situado en la posición p-ésima del
número xb . Por ejemplo, si xb = 75410 (b = 10 y N = 3), entonces xb [2] = 7, xb [1] = 5
y xb [0] = 4. Para obtener el valor decimal de cada uno de los símbolos es necesario
consultar una tabla de equivalencias tal como la mostrada en la Tabla 1.1 para el sistema
decimal. Este número se puede expresar como sigue: 75410 = 7∗102 +5∗101 +4∗100 =
7∗100+5∗10+4∗1 = 700+50+4. La Fórmula 1.1 solo es aplicable a números enteros
positivos.
Para números reales, se debe usar la Fórmula 1.2 , donde N + y N − es el número de
dígitos de la parte entera y de la parte fraccionaria, respectivamente.
0 −N −
p
xb [q] ∗ bq
X X
x10 = xb [p] ∗ b + (1.2)
p=N + −1 q=−1
Ejercicio 1.1 Aplica la Fórmula 1.2 al número 567,08710 tal como se ha realizado
en el ejemplo 1.2
Ejercicio 1.2 Aplica la Fórmula 1.2 al número 0,080710 tal como se ha realizado en
el ejemplo 1.2
Ejercicio 1.3 Aplica la Fórmula 1.2 al número 500,00210 tal como se ha realizado
en el ejemplo 1.2
1.2 Sistemas de numeración posicionales 13
∆ = [0, bN − 1] (1.3)
donde ∆ es el conjunto de todas las cantidades que se pueden expresar dada una base b y
un número de dígitos N.
Ejemplo 1.3 Calcula la cantidad más grande que se puede expresar en un sistema
posicional de base 3 con 5 dígitos. En este caso, b = 3 y N = 5, por lo tanto aplicando la
Fórmula 1.3, la cantidad más grande es bN − 1 = 35 − 1 = 242, dicho de otra forma, el
rango es [0, 242].
Ejercicio 1.4 Calcula la cantidad más grande que se puede expresar en un sistema
posicional de base 7 (b = 7) con 4 dígitos (N = 4).
Ejercicio 1.5 Calcula la cantidad más grande que se puede expresar en un sistema
posicional de base 2 (b = 2) con 5 dígitos (N = 5).
Como se puede comprobar, cuanto más pequeña es la base, más dígitos son necesarios
para expresar la misma cantidad. Por ejemplo, para expresar la cantidad setenta, son
necesarios 2 dígitos si b = 10, 3 si b = 8 y 7 si b = 2.
3 solo tenemos 3 símbolos. Por lo tanto, tenemos que reutilizar los existentes, y de
esta forma la cantidad tres se expresará como sigue: tres → ααβ α3 . De forma similar,
las siguientes cantidades serán expresadas de la siguiente forma: cuatro → ααβ β3 ,
cinco → ααβ γ3 , seis → ααγα3 y así sucesivamente. La última cantidad que podemos
expresar con el sistema Tri (b=3) y con 4 dígitos (N = 4) se obtiene aplicando la Fórmula
1.3: bN − 1 = 34 − 1 = 80.
Para obtener el equivalente de un número expresado en el sistema Tri en el sistema
decimal aplicaremos las fórmulas 1.1 o 1.2 según el número sea un entero o un real,
respectivamente. Por ejemplo, para obtener el equivalente en decimal del número αβ γ3 ,
aplicaremos la Fórmula 1.1 tal como muestra el ejemplo 1.4.
Ejemplo 1.4 Calcula el equivalente en base 10 del número αβ γ3 expresado en el
sistema de numeración Tri.
αβ γ3 =0 ∗ 32 +1 ∗ 31 +2 ∗ 30
= 0 ∗ 9+ 1 ∗ 3+ 2 ∗ 1
= 0+ 3+ 2
= 510
Recordar que tal como muestra la Tabla 1.2, los valores decimales de los símbolos
‘α’, ‘β ’ y ‘γ’ son 0, 1 y 2, respectivamente.
Ejercicio 1.6 Aplica la Fórmula 1.1 al número β αβ γα3 expresado en el sistema de
numeración Tri para obtener su equivalente en base 10, tal como se ha realizado en el
ejemplo 1.4
Además de representar números enteros, el sistema Tri también puede ser usado para
representar números reales. Para obtener elequivalente en decimal debemos aplicar la
Fórmula 1.2, tal como se muestra en el ejemplo 1.5.
Ejemplo 1.5 Calcula el equivalente en base 10 del número β β γ, αβ3 expresado en el
sistema de numeración Tri.
indefinidamente. Por lo tanto, el número 14,111111 . . . se escribe 14.1ó para indicar que
el 1 se repite indefinidamente.
Ejercicio 1.8 Aplica la Fórmula 1.2 al número β αβ γα, γγ3 expresado en el sistema
de numeración Tri para obtener su equivalente en base 10, tal como se ha realizado
en el ejemplo 1.5
bits. Dicho de otro modo, este disco duro tiene 500 ∗ 109 ∗ 8 celdas donde se puede
escribir un 1 o un 0. Ocurre en ocasiones que el fabricante del disco duro interpreta
correctamente las unidades, es decir, para el fabricante 3T B son 3 ∗ 1012 bytes, sin
embargo, el sistema operativo lo interpreta incorrectamente, puesto que comete el error
de creer que 3T B son 3 ∗ 240 bytes. Por lo tanto, cuando le solicitamos al sistema
operativo que nos informe sobre cuantos bytes caben en el disco duro nos informa
que hay sobre 2,7T B cuando en realidad debería decir que hay sobre 2,7TiB. Este
número se obtiene facilmente aplicando una regla de tres para saber cuandos TiB son
3T B: 3 ∗ (1012 /240 ) ≈ 2,7. De esta forma, da la impresión de que el fabricante nos ha
“engañado”, cuando en realidad es el sistema operativo el que comete el error, puesto
que el disco duro tiene los bytes que el fabricante dice que tiene.
Para medir la cantidad de información que se transmite por unidad de tiempo (por
ejemplo en una red WiFi), se usa el bit (y no el byte) y sus múltiplos. Así, podemos tener
en casa una red WiFi capaz de transmitir la información a 500Mib/s, es decir 500 ∗ 220
bits por segundo. Para diferenciar entre bytes y bits, se suele usar una B mayúscula para
byte y una b minúscula para bit.
Ejercicio 1.10 ¿Cuántos bytes son 45KB?
Ejercicio 1.13 Si una red es capaz de transmitir a 3Mib por segundo ¿Cuántos bits
transmitirá en un minuto?
1.4 Solución a los ejercicios propuestos 17
Ejercicio 1.14 Si una red es capaz de transmitir a 2Kib por segundo ¿Cuántos bytes
transmitirá en un minuto?
Solución al ejercicio 1.2 Aplica la Fórmula 1.2 al número 0,080710 tal como se ha
realizado en el ejemplo 1.2:
Solución al ejercicio 1.3 Aplica la Fórmula 1.2 al número 500,00210 tal como se
ha realizado en el ejemplo 1.2:
Solución al ejercicio 1.4 Calcula la cantidad más grande que se puede expresar en
un sistema posicional de base 7 (b = 7) con 4 dígitos (N = 4).
La cantidad más grande es bN − 1 = 74 − 1 = 240010 .
Solución al ejercicio 1.5 Calcula la cantidad más grande que se puede expresar en
un sistema posicional de base 2 (b = 2) con 5 dígitos (N = 5).
La cantidad más grande es bN − 1 = 25 − 1 = 3110
β αβ γα3 =1 ∗ 34 +0 ∗ 33 +1 ∗ 32 +2 ∗ 31 +0 ∗ 30
=1 ∗ 81+0 ∗ 27+ 1 ∗ 9+ 2 ∗ 3+ 0 ∗ 1
= 81+ 0+ 9+ 6+ 0
= 9610
γβ β α3 =2 ∗ 33 +1 ∗ 32 +1 ∗ 31 +0 ∗ 30
=2 ∗ 27+ 1 ∗ 9+ 1 ∗ 3+ 0 ∗ 1
= 54+ 9+ 3+ 0
= 6610
Solución al ejercicio 1.8 Aplica la Fórmula 1.2 al número β αβ γα, γγ3 expresado
en el sistema de numeración Tri para obtener su equivalente en base 10, tal como se
ha realizado en el ejemplo 1.5:
1.4 Solución a los ejercicios propuestos 19
Solución al ejercicio 1.13 Si una red es capaz de transmitir a 3Mib por segundo
¿Cuántos bits transmitirá en un minuto?
3Mib/s son 3 ∗ 220 bits por segundo. Como un minuto tiene 60 segundos, la
respuesta correcta es 3 ∗ 220 ∗ 60 bits.
Solución al ejercicio 1.14 Si una red es capaz de transmitir a 2Kib por segundo
¿Cuántos bytes transmitirá en un minuto?
2Kib/s son 2 ∗ 210 bits por segundo. En un minuto serán 2 ∗ 210 ∗ 60 bits. Pero el
ejercicio pregunta cuantos bytes, por lo tanto habrá que dividir por 8. Entonces, la
respuesta es 2 ∗ 210 ∗ 60/8 = 15 ∗ 210 bytes.
El sistema de numeración binario
De binario a decimal
De decimal a binario
El método de las divisiones sucesivas
por la base
El método de las potencias de la
base
Conversión de números reales
De binario a decimal
De decimal a binario
Operar en binario
Sumar en binario
Restar en binario
Multiplicar y dividir en binario
Solución a los ejercicios propuestos
0001012 =0 ∗ 25 +0 ∗ 24 +0 ∗ 23 +1 ∗ 22 +0 ∗ 21 +1 ∗ 20
= 0+ 0+ 0+ 22 + 0+ 20
= 0+ 0+ 0+ 4+ 0+ 1
= 510
Ejemplo 2.2 Calcula el equivalente en decimal del número 1102 expresado en binario.
1102 =1 ∗ 22 +1 ∗ 21 +0 ∗ 20
= 22 + 21 + 0
= 4+ 2+ 0
= 610
Para la resolución de los siguientes ejercicios puede ser de utilidad consultar la Tabla
2.2 que muestra las veinte primeras potencias de dos.
Ejercicio 2.1 Calcula el equivalente en decimal del número 1010112 expresado en
binario.
Figura 2.1: Ejemplo de como se forma en binario las cantidades cero y uno. Para la
cantidad dos no existe un nuevo símbolo que podamos usar, por lo tanto reutilizamos
los símbolos existentes en el dígito más a la derecha y usamos el siguiente en el de su
izquierda.
por 2). El resultado de la división es 610 y el resto 1. Este resto será el primer dígito (por
la derecha) del número binario resultado del proceso de conversión, es decir el dígito
situado en la posición menos significativa del número. Por lo tanto, hasta el momento el
número binario buscado es 12 . El resultado de la división (610 ) se vuelve a dividir por
2, obteniendo 310 con resto 0. Este nuevo resto se añadirá por la izquierda al número
binario resultado, es decir por ahora el número buscado es 012 . El último paso será
dividir 310 por 2, obteniendo el cociente 1 y el resto 1. El resto se añade al resultado por
la izquierda (el resultado es por ahora x2 = 0112 ). No es necesario volver a dividir por
la base puesto que el último cociente es menor que la base. El último cociente (que será
siempre 1 o 0) se añade al resultado convirtiéndose en el dígito más significativo del
número. Resumiendo el número 1310 es equivalente a 11012 en binario.
Ejemplo 2.3 Calcula el equivalente en binario del número 1310 expresado en decimal
mediante el método de las divisiones sucesivas por la base. Tal como muestra la siguiente
figura y la explicación anterior, el resultado es 11012 .
La flecha muestra el orden en el que hay que usar los símbolos 1 o 0 para componer el
numero binario resultado.
Ejemplo 2.4 Calcula el equivalente en binario del número 2810 expresado en decimal
mediante el método de las divisiones sucesivas por la base. Tal como muestra la siguiente
figura, el resultado es 111002 .
2.3 De decimal a binario 25
Ejercicio 2.5 Convierte a binario el número 910 mediante el método de las divisiones
sucesivas por la base.
Ejercicio 2.6 Convierte a binario el número 3310 mediante el método de las divisio-
nes sucesivas por la base.
Ejercicio 2.7 Convierte a binario el número 10210 mediante el método de las divi-
siones sucesivas por la base.
Ejercicio 2.8 Convierte a binario el número 22010 mediante el método de las divi-
siones sucesivas por la base.
El método de las potencias de la base es una forma alternativa, aunque más compleja,
de convertir un número decimal en otro expresado en cualquier base (en este caso, en
base 2).
Veamos un ejemplo de como convertir el número 4310 usando este método a binario.
Para ello, lo primero que tenemos que hacer es buscar la potencia de 2 (ver Tabla 2.2) más
grande sin superar al número que queremos convertir. En nuestro ejemplo, la potencia
buscada es 25 = 32, puesto que la siguiente 26 = 64 supera al número que queremos
convertir 4310 . Una vez encontrado la potencia de 2 más grande sin superar al número (25
en nuestro caso), sabremos que el número binario buscado, al que llamaremos x2 , tiene 6
dígitos (N = 6) y que se puede descomponer en potencias de 2 de la siguiente forma (ver
Fórmula 1.1): 4310 = x2 [5]∗25 +x2 [4]∗24 +x2 [3]∗23 +x2 [2]∗22 +x2 [1]∗21 +x2 [0]∗20 .
Además sabemos que x2 [5] = 1.
Ahora tenemos que averiguar el valor del resto de dígitos. Para ello, debemos restar
a 4310 el valor de la potencia encontrada (25 = 32), obteniendo 1110 . El siguiente paso
es repetir el proceso anterior buscando la potencia de 2 más grande pero menor a 1110 .
En este caso, la potencia buscada es 23 = 8 y por lo tanto, x2 [3] = 1. Es importante
fijarse que la potencia encontrada no es 24 = 16, que es justo la siguiente a 25 , por lo que
x2 [4] = 0. Dicho de otra forma, en la descomposición del número 4310 en potencias de 2,
24 no interviene. Seguimos el proceso, restando a 1110 el valor de la potencia encontrada
(23 = 8) para obtener 310 . La siguiente potencia de 2 será 21 = 2, por lo tanto, x2 [2] = 0
(al no intervenir 22 ) y x2 [1] = 1. Al restar a 310 la potencia de 2 encontrada (21 = 2)
obtenemos 1, lo que hace que el proceso finalice y tanto x2 [0] = 1. El número binario
buscado es: x2 = 1010112 .
Ejemplo 2.5 Calcula el equivalente en binario del número 4310 expresado en decimal
mediante el método de las potencias de la base. Tal como muestra la siguiente figura y
la explicación anterior, el resultado es 1010112 .
26 Capítulo 2. El sistema de numeración binario
Ejemplo 2.6 Calcula el equivalente en binario del número 2810 expresado en decimal
mediante el método de las potencias de la base. Tal como muestra la siguiente figura, el
resultado es 111002 .
Ejercicio 2.9 Convierte a binario el número 1710 mediante el método de las potencias
de la base.
usando el formato IEEE754 que será explicado en detalle en el Capítulo 5. Ahora bien,
para convertir números reales expresados en decimal al formato binario IEEE754 es
necesario conocer el proceso de conversión de la parte entera y de la parte fraccionaria
tal como se comenta en este capítulo.
métodos son: el método de las multiplicaciones (en vez de divisiones) sucesivas por la
base y el método de las potencias negativas (en vez de las positivas) de la base. En este
documento, nos centraremos únicamente en el método del las multiplicaciones sucesivas
por la base por su simplicidad.
Para explicar como se convierte a binario la parte fraccionaria de un número real
expresado en decimal, mediante el método de las multiplicaciones sucesivas por la base,
usaremos el número 0,2510 como ejemplo. Este método consiste en realizar multiplica-
ciones sucesivas por la base (2 en binario) hasta que el resultado de la multiplicación
sea igual o superior a 1. Las partes enteras resultantes de las multiplicaciones (que serán
todas 0 salvo la última que será 1), serán los símbolos que usaremos para formar el
número binario.
Comenzamos el proceso multiplicando 0,2510 por la base obteniendo un 0,510 .
Puesto que el resultado es menor que 1, el primer dígito del número binario resultado
después de la coma será un 0, por lo que de momento el resultado es 0,02 . El siguiente
paso es multiplicar el resultado de la multiplicación anterior (0,510 ) por 2, obteniendo
1,010 . Como el resultado es igual o superior a 1, el proceso se detiene y el siguiente
dígito a la derecha del número binario resultado será un 1. Es decir, el resultado es 0,012 .
Por lo tanto, obtenemos 0,2510 ≡ 0,012 .
En el ejemplo anterior, el proceso se detiene puesto que la última multiplicación es
igual a 1. Pero, ¿qué ocurriría si el resultado fuese mayor a 1? Veamos un ejemplo de
este caso, convertiendo el número 0,410 a binario. El proceso comienza multiplicando
0,410 por la base, obtiendo 0,810 , por lo tanto el número binario buscado es hasta el
momento 0,02 . Puesto que el resultado de la multiplicación es menor que 1, el proceso
continúa multiplicando el resultado 0,810 por 2, obteniendo 1,610 . El número buscado
es ahora 0,012 . Tal como hemos explicado, al ser el resultado de la multiplicación igual
o superior a 1, el proceso debería finalizar. Si así lo hicieramos estaríamos diciendo que
0,410 ≡ 0,012 . Si convertimos el número binario 0,012 a decimal (aplicando la Fórmula
1.2) obtenemos que realmente 0,012 = 0 ∗ 20 + 0 ∗ 2−1 + 1 ∗ 2−2 = 2−2 = 0,25. Es decir,
0,410 6= 0,2510 . En realidad el resultado que hemos obtenido es una aproximación.
Si queremos mejorar esta aproximación, debemos continuar el proceso con el re-
sultado de la última multiplicación menos la parte entera (el 1), es decir con 0,610 .
Multiplicando 0,610 por 2 obtenemos 1,210 . Con este nuevo paso, añadiremos un 1
al resultado que teniamos hasta el momento, obteniendo 0,0112 . De nuevo podemos
finalizar el proceso puesto que el resultado de la última multiplicación es superior a 1.
Si así lo hacemos, obtenemos que 0,410 ≡ 0,0112 , pero (aplicando de nuevo la Fórmula
1.2) 0,0112 ≡ 0,375010 y por lo tanto 0,410 6= 0,375010 . Como podemos comprobar,
hemos mejorado la aproximación, pero todavía no hemos encontrado el valor exacto.
Podemos mejorar la aproximación continuando con el mismo proceso. Por lo tanto,
multiplicando 0,210 por dos sucesivamente, se obtiene 0,410 , 0,810 y 1,610 . Lo que
resulta en añadir 0012 al resultado, para obtener 0,0110012 . Este número sigue sin ser
exactamente igual a 0,410 , puesto que es 0,0110012 ≡ 0,390610 . De nuevo, podríamos
mejorar la aproximación repitiendo el proceso hasta que consiguieramos un resultado de
la multiplicación exactamente igual a 1. En este ejemplo, esto no ocurre nunca, por lo
que no es posible representar el número 0,410 de forma exacta en binario. Cuantos más
dígitos usemos en la parte fraccionaria, más exacto será el resultado obtenido.
Ejemplo 2.8 Convierte el número real 6,12510 a binario. El resultado es 110,0012 . El
2.5 Operar en binario 29
equivalente en binario a la parte entera 610 es 1102 . Tal como muestra la siguiente figura,
el equivalente a 0,12510 en binario es 0,0012
Ejemplo 2.9 Convierte el número real 2,310 a binario. No es posible obtener un resul-
tado exacto, una aproximación usando 6 dígitos en la parte fraccionaria es 10,0100112
El equivalente en binario a la parte entera 210 es 102 . Tal como muestra la siguiente
figura, una aproximación a 0,310 en binario (usando únicamente 6 dígitos en la parte
fraccionaria) es 0,0100112 .
dice que la suma del símbolo 1 y del símbolo 3 produce como resultado el símbolo 4, y
que la suma del símbolo 7 y del símbolo 5 produce como resultado el símbolo 2 con
acarreo.
Definición 2.5.1 — Acarreo. Acarreo significa lo mismo que comúnmente nombra-
mos como llevo 1.
La Tabla 2.4 muestra los símbolos resultados y si se produce o no acarreo de todas las
combinaciones posibles en binario. Como se puede comprobar la suma de los símbolos
12 y 12 produce como resultado el símbolo 02 con acarreo, o lo que es lo mismo, el
número binario 102 (que es 210 en decimal).
Ejemplo 2.10 Suma los números en binarios 10012 y 00112 .
Cuando sumamos dos números, sea la que sea la base, es importante tener en cuenta el
número de dígitos disponibles. Si la suma de los dos dígitos más significativos (los de más
a la izquierda) produce acarreo, entonces el número resultado no se puede representar
con ese número de dígitos, produciéndose lo que se conoce como desbordamiento
(overflow en inglés).
Definición 2.5.2 — Desbordamiento aritmético. El desbordamiento aritmético
[Wik14d] se produce cuando se desea almacenar un número cuya representación
en binario necesita más dígitos que los que tiene el medio de almacenamiento. Por
ejemplo, si el almacenamiento es de cuatro bits, este podrá almacenar desde 00002
hasta 11112 , en binario. Si tenemos 11112 almacenado y sumamos 12 , el resultado
será 1 00002 , que no cabe por ser un código de cinco bits.
Definición 2.5.3
Ejercicio 2.16 Suma los números en binario 00112 y 01012 con N = 4. Comprueba
el resultado convirtiendo los números a decimal.
Ejercicio 2.17 Suma los números en binario 01112 y 01002 con N = 4. Comprueba
el resultado convirtiendo los números a decimal.
Ejercicio 2.18 Suma los números en binario 11002 y 01112 con N = 4. Comprueba
el resultado convirtiendo los números a decimal.
Al igual que con la suma, realizar restas en binario es un proceso idéntico a realizar
restas en cualquier otra base (como en decimal). Para ello, es necesario tener una tabla
que muestre que símbolo es el resultado de la resta de otros otros y si se produce o
no acarreo. Por ejemplo, en decimal, dicha tabla nos diría que el resultado de restar al
símbolo 510 el símbolo 210 es el símbolo 310 . De forma similar, el resultado de restar al
símbolo 410 el símbolo 610 es 810 con acarreo. Esto último es posible, siempre que a la
izquierda del 410 exista otro símbolo diferente al 010 , es decir, que en realidad estemos
restando, por ejemplo, 1410 − 610 . Si no fuera ese el caso, no se podría restar.
Definición 2.5.4 — Minuendo y substraendo. En una resta están involucrados dos
números llamados minuendo y subtraendo. El minuendo es el número mayor y se
sitúa en la parte de arriba de la resta. El substraendo es la cantidad que queremos
quitar al minuendo y se sitúa en la parte inferior de la resta. Si el substraendo es
mayor que el minuendo, el resultado es un número negativo.
Ejercicio 2.19 Resta los números en binario 10112 y 01012 con N = 4. Comprueba
el resultado convirtiendo los números a decimal.
Ejercicio 2.20 Resta los números en binario 10102 y 01102 con N = 4. Comprueba
el resultado convirtiendo los números a decimal.
Ejercicio 2.21 Resta los números en binario 00102 y 01102 con N = 4. Comprueba
el resultado convirtiendo los números a decimal.
Figura 2.2: Proceso de multiplicación del número binario 001012 por una vez la base.
Figura 2.3: Proceso de división del número binario 010102 por una vez la base.
Ejemplo 2.15 Multiplica el número binario 0001012 por 810 = 23 (10002 en binario)
con N = 6. El resultado es 1010002 . Hemos añadido 3 ceros a la derecha y desplazado 3
posiciones todos los dígitos hacia la izquierda.
Ejemplo 2.16 Divide el número binario 001112 por 210 = 21 (102 en binario) con
N = 5. El resultado es 000112 . Hemos añadido 1 cero a la izquierda y desplazado 1
posición todos los dígitos hacia la derecha. Como se puede comprobar, la división que
estamos realizando es una división entera en la que solo obtenemos el cociente.
Ejemplo 2.17 Divide el número binario 0011012 por 810 = 23 (10002 en binario) con
N = 6. El resultado es 0000012 . Hemos añadido 3 ceros a la izquierda y desplazado 3
posiciones todos los dígitos hacia la derecha. Igual que en el ejemplo anterior, la división
que estamos realizando es una división entera en la que solo obtenemos el cociente.
Ejercicio 2.22 Multiplica el número binario 0101012 una vez por la base con N = 6.
34 Capítulo 2. El sistema de numeración binario
Ejercicio 2.23 Multiplica el número binario 0001112 dos veces por la base con
N = 6.
Ejercicio 2.24 Divide el número binario 0101012 una vez por la base con N = 6.
Ejercicio 2.25 Divide el número binario 0101112 dos veces por la base con N = 6.
Ejercicio 2.26 Multiplica el número binario 0101112 cuatro veces por la base con
N = 6.
1010112 =1 ∗ 25 +0 ∗ 24 +1 ∗ 23 +0 ∗ 22 +1 ∗ 21 +1 ∗ 20
= 25 + 0+ 23 + 0+ 21 + 20
= 32+ 0+ 8+ 0+ 2+ 1
= 4310
1101112 =1 ∗ 25 +1 ∗ 24 +0 ∗ 23 +1 ∗ 22 +1 ∗ 21 +1 ∗ 20
= 25 + 24 + 0+ 22 + 21 + 20
= 32+ 16+ 0+ 4+ 2+ 1
= 5510
expresado en binario.
01112 =0 ∗ 23 +1 ∗ 22 +1 ∗ 21 +1 ∗ 20
= 0+ 22 + 21 + 20
= 0+ 4+ 2+ 1
= 710
111101112 =1 ∗ 27 +1 ∗ 26 +1 ∗ 25 +1 ∗ 24 +0 ∗ 23 +1 ∗ 22 +1 ∗ 21 +1 ∗ 20
= 27 + 26 + 25 + 24 + 0+ 22 + 21 + 20
= 128+ 64+ 32+ 16+ 0+ 4+ 2+ 1
=24710
Solución al ejercicio 2.16 Suma los números en binario 00112 y 01012 con N = 4.
Comprueba el resultado convirtiendo los números a decimal.
La solución es: 00112 + 01012 = 10002 . En decimal: 3 + 5 = 8.
Solución al ejercicio 2.17 Suma los números en binario 01112 y 01002 con N = 4.
Comprueba el resultado convirtiendo los números a decimal.
La solución es: 01112 + 01002 = 10112 . En decimal: 7 + 4 = 11.
Solución al ejercicio 2.18 Suma los números en binario 11002 y 01112 con N = 4.
Comprueba el resultado convirtiendo los números a decimal.
Con N = 4 no es posible sumar estos dos números pues se produce desborda-
miento. Si N fuera 8, entonces si sería posible y la solución sería: 000011002 +
000001112 = 000100112 . En decimal: 12 + 7 = 19.
Solución al ejercicio 2.19 Resta los números en binario 10112 y 01012 con N = 4.
Comprueba el resultado convirtiendo los números a decimal.
La solución es 01102 .
Solución al ejercicio 2.20 Resta los números en binario 10102 y 01102 con N = 4.
Comprueba el resultado convirtiendo los números a decimal.
La solución es 01002 .
Solución al ejercicio 2.21 Resta los números en binario 00102 y 01102 con N = 4.
Comprueba el resultado convirtiendo los números a decimal.
2.6 Solución a los ejercicios propuestos 37
Solución al ejercicio 2.22 Multiplica el número binario 0101012 una vez por la
base con N = 6.
El resultado es 1010102 .
Solución al ejercicio 2.23 Multiplica el número binario 0001112 dos veces por la
base con N = 6.
El resultado es 0111002 .
Solución al ejercicio 2.24 Divide el número binario 0101012 una vez por la base
con N = 6.
El resultado es 0010102 .
Solución al ejercicio 2.25 Divide el número binario 0101112 dos veces por la base
con N = 6.
El resultado es 0001012 .
Solución al ejercicio 2.26 Multiplica el número binario 0101112 cuatro veces por
la base con N = 6.
No es posible expresar el resultado de esta multiplicación con 6 dígitos.
El sistema de numeración hexadeci-
mal
Relación entre hexadecimal y binario
De hexadecimal a decimal
De decimal a hexadecimal
Solución a los ejercicios propuestos
mayores cantidades.
Figura 3.1: Ejemplo de como se forma en hexadecimal las cantidades nueve, diez y once.
Para la cantidad diez existe un nuevo símbolo que podamos usar ‘A’. Lo mismo ocurre
con la cantidad once
.
2D16 .
Figura 3.2: Ejemplo de como se forma en binario las cantidades quince, dieciséis y
diecisiete. Para la cantidad dieciséis no existe un nuevo símbolo que podamos usar, por
lo tanto reutilizamos los símbolos existentes en el dígito más a la derecha y usamos el
siguiente en el de su izquierda.
A0F416 ≡ 10100000111101002 .
3.3 De hexadecimal a decimal 43
Tabla 3.2: Relación entre los sistemas de numeración binario, hexadecimal y decimal.
BA16 = 1 ∗ 27 +0 ∗ 26 +1 ∗ 25 +1 ∗ 24 +1 ∗ 23 +0 ∗ 22 +1 ∗ 21 +0 ∗ 20
=1 ∗ 128+0 ∗ 64+1 ∗ 32+1 ∗ 16+ 1 ∗ 8+ 0 ∗ 4+ 1 ∗ 2+ 0 ∗ 1
= 128+ 0+ 32+ 16+ 8+ 0+ 2+ 0
= 18610
44 Capítulo 3. El sistema de numeración hexadecimal
3.5 Solución a los ejercicios propuestos 45
4.1 Introducción
Hasta el momento hemos estudiado los sistemas de numeración posicionales en
general (Capítulo 1), el sistema de numeración binario (Capítulo 2) y el sistema de
numeración hexadecimal (Capítulo 3). Como hemos comentado anteriormente en varias
ocasiones, los sistemas de numeración binario y hexadecimal se usan principalmente en
el campo de las tecnologías de la información.
En este capítulo, vamos a estudiar como los ordenadores codifican los números
enteros positivos en binario usando un número concreto de bits. Recordemos que si un
número se codifica usando N bits, entonces serán necesarios N dígitos en binario para
representarlo. Además, podemos usar el sistema hexadecimal para representar dicho
número de forma más compacta, teniendo en cuenta que, cada 4 dígitos en binario,
tenemos su equivalente de 1 dígito en hexadecimal.
En este capítulo y en los siguientes, escribiremos un pequeño espacio cada cuatro
dígitos binarios, empezando a agrupar por la derecha, para de esta forma, facilitar
la lectura de los números binarios. Es decir, que en vez de escribir 1110100101012 ,
escribiremos 1110 1001 01012 .
lado, hay que tener en cuenta que cuanto más grande (en bits) sea el tipo de datos, más
memoria ocupará y la memoria es un elemento finito en el ordenador.
Además del tamaño, es importante pensar si el concepto que queremos representar
puede tener valores negativos o no. Por ejemplo, si queremos contar la cantidad de veces
que ocurre algún evento, no tiene sentido usar números negativos. Usar tipos de datos
que admitan negativos permite representar, con el mismo número de bits, la mitad de
cantidades que si usamos un tipo de datos que solo permite números positivos. En el
Capítulo 5 explicaremos la razón.
Veamos un ejemplo real. La popular plataforma web Youtube 1 eligió para codificar
el contador de visitas de cada vídeo, un número entero de 32 bits pero que admitía
tanto números positivos como negativos. Como ya sabemos con 32 bits (es decir, con
N = 32 y b = 2) es posible representar 232 = 4 294 967 296 cantidades. Pero al usar
números con signo, el rango se reduce a la mitad, por lo que el valor máximo que se
puede representar es 2 147 483 647. Posiblemente, los diseñadores del sitio web nunca
imaginaron que podría existir un vídeo cuyo número de visitas superase ese valor. Pero,
el popular vídeo del cantante surcoreano Psy lo ha conseguido [Abc14]. La solución
que han adoptado es cambiar la codificación del contador por un formato de 64 bits
que permite, 264 = 18 446 744 073 709 551 616 posibles valores. Este número, parece
ser una cantidad lo suficientemente grande para que nunca un vídeo pueda superar ese
numero de visitas en el futuro. Sin embargo, esta decisión ha tenido una consecuencia
importante. Ahora el almacenamiento del contador supone el doble de memoria para
cada vídeo. Asumiendo que el número de vídeos incluidos en youtube es también una
cifra astronómica, esta decisión ha debido suponer también un aumento considerable de
la memoria necesaria para el funcionamiento de la plataforma. En concreto, ahora es
necesario justo el doble de memoria.
La codificación de los principales tipos de datos dependen del lenguaje de programa-
ción seleccionado. Por ejemplo, el lenguaje de programación C++ tiene tipos de datos
para representar números enteros de 8, 16, 32 y 64 bits, tanto con signo como sin signo.
Sin embargo, en el lenguaje Java, aunque también existen tipos de 8, 16, 32 y 64 bits,
son siempre con signo [Doc15]. Por lo tanto, un entero de 32 bits en C++ sin signo (es
decir solo positivos) permitirá representar el doble de cantidades que su equivalente de
32 bits con signo en C++ o en Java (que son siempre con signo).
Asumiendo que usamos codificación sin signo, es decir siempre positivos, los rangos
de valores que se pueden expresar con 8, 16, 32 y 64 bits son los siguientes:
8 bits: [0, 28 − 1] = [0, 255]
16 bits: [0, 216 − 1] = [0, 65 535]
32 bits: [0, 232 − 1] = [0, 4 294 967 295]
64 bits: [0, 264 − 1] = [0, 18 446 744 073 709 551 615]
En las siguientes secciones, vamos a explicar como se codifican números enteros
positivos (es decir, números sin signo) usando tipos de datos de 8, 16, 32 y 64 bits.
Dichos tipos de datos serán llamados byte (8 bits), short (16 bits), int (32 bits) y long (64
bits). Hemos elegido esos nombres pues son los que se usan en algunos de los lenguajes
de programación más populares.
1 http://www.youtube.com
4.3 Enteros positivos con 8 bits: byte 49
Aplicando, por ejemplo, el método de la divisiones sucesivas por la base (ver Apar-
tado 2.3), obtenemos 5810 ≡ 11 10102 . Puesto que el número resultado tiene 6 dígitos,
hemos de añadir dos símbolos "0.a la izquierda. El resultado final es: 0011 10102 en
binario. Su equivalente en hexadecimal es: 3A16 .
Ejercicio 4.1 Representa usando el tipo de datos byte el número 1810 . Expresa el
resultado tanto en binario como en hexadecimal.
Ejercicio 4.2 Representa usando el tipo de datos byte el número 15810 . Expresa el
resultado tanto en binario como en hexadecimal.
Ejercicio 4.3 Representa usando el tipo de datos byte el número 22810 . Expresa el
resultado tanto en binario como en hexadecimal.
Ejercicio 4.4 Representa usando el tipo de datos byte el número 29810 . Expresa el
resultado tanto en binario como en hexadecimal.
Aplicando, por ejemplo, el método de la divisiones sucesivas por la base (ver Aparta-
do 2.3), obtenemos 5810 ≡ 11 10102 . Puesto que el número resultado tiene 6 dígitos, he-
mos de añadir 10 símbolos "0.a la izquierda. El resultado final es: 0000 0000 0011 10102
en binario. Su equivalente en hexadecimal es: 003A16 .
Ejercicio 4.5 Representa usando el tipo de datos short el número 186710 . Expresa el
resultado tanto en binario como en hexadecimal.
Ejercicio 4.6 Representa usando el tipo de datos short el número 135810 . Expresa el
resultado tanto en binario como en hexadecimal.
Ejercicio 4.7 Representa usando el tipo de datos short el número 22 12810 . Expresa
el resultado tanto en binario como en hexadecimal.
Ejercicio 4.8 Representa usando el tipo de datos short el número 70 00010 . Expresa
el resultado tanto en binario como en hexadecimal.
Ejercicio 4.9 Representa usando el tipo de datos int el número 186710 . Expresa el
resultado tanto en binario como en hexadecimal.
Ejercicio 4.10 Representa usando el tipo de datos int el número 135810 . Expresa el
resultado tanto en binario como en hexadecimal.
4.6 Enteros positivos con 64 bits: long 51
Ejercicio 4.11 Representa usando el tipo de datos long el número 186710 . Expresa
el resultado tanto en binario como en hexadecimal.
Ejercicio 4.12 Representa usando el tipo de datos long el número 135810 . Expresa
el resultado tanto en binario como en hexadecimal.
Solución al ejercicio 4.2 Representa usando el tipo de datos byte el número 15810 .
Expresa el resultado tanto en binario como en hexadecimal.
El resultado es 1001 11102 en binario y 9E16 en hexadecimal.
Solución al ejercicio 4.3 Representa usando el tipo de datos byte el número 22810 .
Expresa el resultado tanto en binario como en hexadecimal.
El resultado es 1110 01002 en binario y E416 en hexadecimal.
Solución al ejercicio 4.4 Representa usando el tipo de datos byte el número 29810 .
Expresa el resultado tanto en binario como en hexadecimal.
No es posible representar este número usando 8 bits.
52 Capítulo 4. Codificación de números enteros positivos
Solución al ejercicio 4.9 Representa usando el tipo de datos int el número 186710 .
Expresa el resultado tanto en binario como en hexadecimal.
El resultado es 0000 0000 0000 0000 0000 0111 0100 10112 en binario y 0000074B16
en hexadecimal.
Solución al ejercicio 4.10 Representa usando el tipo de datos int el número 135810 .
Expresa el resultado tanto en binario como en hexadecimal.
El resultado es 0000 0000 0000 0000 0000 0101 0100 11102 en binario y 0000054E16
en hexadecimal.
5.1 Introducción
En el Capítulo 2, hemos comentado que no es posible restar dos números si el
minuendo (el número de arriba) es menor que el substraendo (el número de abajo).
Para poder realizar este tipo de operaciones, son necesarios los números negativos. En
decimal, usamos el símbolo “-” delante del número para expresar que un número es
negativo. Sin embargo, en binario únicamente podemos usar unos y ceros, por lo que no
es posible usar otro símbolo adicional para expresar que un número es negativo.
Existen tres formas principales de expresar números con signo en binario: Signo-
magnitud, Exceso Z y Complemento a 2. Esta última, es la forma en la que los ordenado-
res actuales codifican los números negativos. Aunque cada método es diferente, el rango
de números que se puede expresar es similar. En todos los casos, el mayor número que
se puede expresar se reduce a la mitad con respecto a la representación de los números
sin signo (enteros positivos). Dicho de forma coloquial, la mitad del espacio se usa para
representar los números negativos y la otra mitad para los positivos. Por lo tanto, con el
mismo número de bits, si se usa codificación con signo, será posible alcanzar un número
aproximadamente la mitad de grande que si se usa codificación sin signo. Por ejemplo,
con 8 bits sin signo, se puede representar el rango: [0, 255], sin embargo, con signo, el
rango será: [−128, 127].
Los procesadores actuales tienen operaciones con signo y sin signo. Si se usa
operaciones sin signo, el procesador interpreta los bits como un número que solo puede
ser entero positivo. Pero si se usa una operación con signo, entonces el procesador
interpreta los bits como si fuera un número que puede ser positivo o negativo (codificado
en Complemento a 2). Por lo tanto, es posible que un mismo conjunto de bits, pueda
expresar dos cantidades diferentes dependiendo de si la operación es con o sin signo.
5.2 Signo-magnitud
La forma que parece más evidente de codificar un número con signo es usar un dígito
para expresar si es positivo o negativo. En Signo-magnitud, los números se codifican
54 Capítulo 5. Codificación de números enteros con signo
usando el primer dígito (el más significativo) como signo y el resto para codificar el
valor absoluto del número. El primer dígito será “0” para números positivos y “1” para
números negativos. Al perder un bit, el rango se reduce a la mitad. Así, dado un número
de dígitos N, en Signo-magnitud el rango de valores que se puede representar es:
Por ejemplo, con 8 bits, el rango será [-127,+127]. El número positivo más grande
será 0111 11112 (12710 ). De forma similar, el número negativo más pequeño será
1111 11112 (−12710 )
Ejemplo 5.1 Expresa el número 2710 en binario con codificación Signo-magnitud
con 8 bits. Como el número es positivo, el primer bit es 0. Para los otros 7, hemos
de codificar el número 2710 con 7 bits, obteniendo: 001 10112 . Por lo tanto, 2710 es
equivalente, en Signo-magnitud con 8 bits, a: 0001 10112 o 1B16 en hexadecimal.
con 8 bits. Como el número es negativo, el primer bit es 1. Para los otros 7, hemos de
codificar el valor absoluto del número −3710 , es decir, hemos de codificar el número
3710 con 7 bits, obteniendo: 010 01012 . Por lo tanto, −3710 es equivalente, en Signo-
magnitud con 8 bits, a: 1010 01012 o A516 en hexadecimal.
con 8 bits. No es posible codificar este número en Signo-magnitud con 8 bits pues
está fuera de rango. Hay que tener en cuenta que si estuviéramos codificando como un
número sin signo, entonces si que se podría representar con 8 bits.
aritméticas. Dicho de otra forma, los circuitos necesarios para tener en cuenta el signo y
para darse cuenta de si la operación es una suma o una resta, complican mucho el diseño
de los procesadores. Existen otras formas de representar números con signo que ayudan
a que el diseño de los procesadores sea lo más simple que sea posible (y por lo tanto
rápido).
Ejercicio 5.1 Expresa el número −12010 en binario con codificación Signo-magnitud
con 8 bits.
Ejercicio 5.5 ¿Cuál será el resultado de sumar los números 1010 10102 y 0000 11102
teniendo en cuenta el signo (con codificación Signo-magnitud de 8 bits)? ¿Y sin
tenerlo en cuenta?
Ejercicio 5.6 ¿Cuál será el resultado de sumar los números 1010 00102 y 0010 11102
teniendo en cuenta el signo (con codificación Signo-magnitud de 8 bits)? ¿Y sin
tenerlo en cuenta?
5.3 Exceso Z
Otra forma de codificar los números con signo es la codificación en Exceso Z. Esta
técnica consiste en sumarle un número fijo al número que queremos expresar, de forma
que no tengamos números negativos. A la cantidad que sumamos le llamamos Z. El
valor de Z se obtiene de la siguiente forma:
Z = 2N−1 − 1 (5.2)
Tal como muestra la ecuación anterior, Z es el valor absoluto del número negativo
más pequeño que se puede expresar con un determinado número de bits. Con 8 bits,
Z = 127. Por lo tanto, para representar un número cualquiera, le deberemos sumar
Z = 127, y luego expresar ese número en binario. De esta forma, el número más pequeño
que se puede representar −127 se convertirá en 0 al sumar Z.
Ejemplo 5.5 Expresa el número 5010 en Exceso Z con 8 bits. Puesto que tenemos que
representar el número con 8 bits, Z será igual a Z = 28−1 −1 = 127. Por lo tanto, tenemos
que sumar 12710 al número que queremos representar, obteniendo 5010 + 12710 = 17710 .
El siguiente paso es representar 17710 en binario con 8 bits, obteniendo 1011 00012 .
56 Capítulo 5. Codificación de números enteros con signo
Ejemplo 5.6 Expresa el número −5010 en Exceso Z con 8 bits. Tenemos que su-
mar 12710 al número que queremos representar, obteniendo −5010 + 12710 = 7710 . El
siguiente paso es representar 7710 en binario con 8 bits, obteniendo 0100 11012 .
Para expresar número con signo en Exceso Z dado un número de bits diferente a 8,
debemos calcular cuanto es Z mediante la Fórmula 5.2.
Ejemplo 5.8 Expresa el número −5010 en Exceso Z con 16 bits. Puesto que tenemos
que representar el número con 16 bits, Z será igual a Z = 216−1 − 1 = 32 767. Por lo
tanto, tenemos que sumar 32 76710 al número que queremos representar, obteniendo
−5010 + 32 76710 = 32 71710 . El siguiente paso es representar 32 71710 en binario con
16 bits, obteniendo 0111 1111 1100 11012 .
Ejemplo 5.9 Expresa el número −5010 en Exceso Z con 32 bits. Puesto que tenemos
que representar el número con 32 bits, Z será igual a Z = 232−1 − 1 = 2 147 483 647.
Por lo tanto, tenemos que sumar 2 147 483 64710 al número que queremos representar,
obteniendo −5010 +2 147 483 64710 = 2 147 483 59710 . El siguiente paso es representar
2 147 483 59710 en binario con 32 bits, obteniendo 0111 1111 1111 1111 1111 1111 1100 11012 .
representar es:
Por ejemplo, con 8 bits, el rango será [-127,128]. El número positivo más grande
será 1111 11112 (12810 = 25510 − 12710 ). De forma similar, el número negativo más
pequeño será 0000 00002 (−12710 = 010 − 12710 ).
Para convertir un número expresado en Exceso Z a decimal, debemos conocer el
valor Z con el que se codificó el número y realizar el proceso contrario. Es decir, primero
obtener el equivalente en binario, como si fuera un número entero positivo, y luego
restarle Z.
5.4 Complemento a 2
La solución final que se ha adoptado para representar números con signo es cono-
cida como Complemento a 2. En este caso, el proceso de representación es diferente
dependiendo del signo del número. Los números positivos se expresan en binario de
forma igual a como ya se ha explicado en el Capítulo 4. Sin embargo, para convertir un
número decimal negativo a Complemento a 2 hay que seguir 3 sencillos pasos:
1. Convertir el valor absoluto del número a binario como si fuera positivo.
2. Invertir los ceros por unos y viceversa.
3. Sumar 1 al resultado obtenido.
Ejemplo 5.12 Expresa el número 5610 en Complemento a 2 con 8 bits. Puesto que es
positivo, el resultado es 0011 10002 .
La Tabla 5.1 muestra los posibles valores que se pueden representar con N = 4. El
número más pequeño es −810 ≡ 10002 , y el más grande 710 ≡ 01112 .
Ejercicio 5.19 Expresa 3410 en Complemento a 2 con 8 bits.
Decimal Binario
-8 1000
-7 1001
-6 1010
-5 1011
-4 1100
-3 1101
-2 1110
-1 1111
0 0000
1 0001
2 0010
3 0011
4 0100
5 0101
6 0110
7 0111
que tenemos que hacer es añadir ceros por la izquierda, si el número es positivo, y unos,
si es negativo.
Ejercicio 5.23 Expresa −810 en Complemento a 2 con 16 bits.
el siguiente:
de codificar el valor absoluto de −12010 , es decir 12010 , con 7 dígitos. Puesto que
12010 ≡ 111 10002 , la solución es −12010 ≡ 1111 10002 .
Solución al ejercicio 5.5 ¿Cuál será el resultado de sumar los números 1010 10102
y 0000 11102 teniendo en cuenta el signo (con codificación Signo-magnitud de 8
bits)? ¿Y sin tenerlo en cuenta?
Teniendo en cuenta el signo, 1010 10102 ≡ −4210 y 0000 11102 ≡ 1410 . Por
lo tanto el resultado de la suma será −4210 + 1410 = −2810 , que se expresará en
Signo-magnitud como 1001 11002 . Sin tener en cuenta el signo, 1010 10102 ≡ 17010
y 0000 11102 ≡ 1410 . Por lo tanto el resultado de la suma será 17010 + 1410 = 18410 ,
que se expresará en Signo-magnitud como 1011 10002 .
Solución al ejercicio 5.6 ¿Cuál será el resultado de sumar los números 1010 00102
y 0010 11102 teniendo en cuenta el signo (con codificación Signo-magnitud de 8
bits)? ¿Y sin tenerlo en cuenta?
Teniendo en cuenta el signo, 1010 00102 ≡ −3410 y 0010 11102 ≡ 4610 . Por lo
tanto el resultado de la suma será −3410 + 4610 = 1210 , que se expresará en Signo-
magnitud como 0000 11002 . Sin tener en cuenta el signo, 1010 00102 ≡ 16210 y
0010 11102 ≡ 4610 . Por lo tanto el resultado de la suma será 16210 + 4610 = 20810 ,
que se expresará en Signo-magnitud como 1101 00002 .
Al ser un número negativo, hay que aplicar los tres pasos, obteniendo como
resultado: 1111 01112 ≡ −910 .
6.1 Introducción
En este capítulo, se explicará como se codifican los números reales. En el Capítulo 2
se comentó que, para codificar los números reales, no podemos usar más símbolos que
el “0” o el “1”. Por lo tanto, no es posible codificar en un ordenador, por ejemplo, el
número 5,2510 como 101,012 , puesto que no es posible usar el símbolo “,” para separar
la parte entera de la parte fraccionaria. La solución a este problema la encontramos en
el estándar IEEE754 que define como se deben codificar los números reales en binario.
Vamos a ver dos versiones de este estándar, la primera de 32 bits y la segunda de 64 bits.
a ∗ be (6.1)
donde:
a es un número real cuya parte entera tiene un único dígito. a recibe el nombre de
mantisa o coeficiente.
b es la base.
e es un número entero que recibe el nombre de exponente u orden de magnitud.
Ejemplo 6.1 Expresa el número 566,0310 en notación científica. Para conseguir que
la parte entera tenga solo un dígito será necesario dividir el número por dos veces la base
(b = 10), obteniendo 566,0310 = 5,660310 ∗ 102 . Por lo tanto, el exponente es e = 210 , y
la mantisa a = 5,660310 .
66 Capítulo 6. Codificación de números reales
Ejemplo 6.2 Expresa el número 0,005310 en notación científica. Para conseguir que
la parte entera tenga solo un dígito será necesario multiplicar el número por tres veces
la base (b = 10), obteniendo 0,005310 = 5,310 ∗ 10−3 . Por lo tanto, el exponente es
e = −310 , y la mantisa a = 5,310 .
Ejemplo 6.6 Expresa el número real 0,12510 en binario usando notación científica.
El primer paso es convertir a binario la parte entera 010 obteniendo 02 . El segundo
paso es convertir a binario la parte fraccionaria 0,12510 , obteniendo 0,0012 . Por lo tanto,
0,12510 ≡ 0,0012 . Finalmente, expresamos el número binario resultante usando notación
científica, obteniendo: 0,12510 ≡ 1,0 ∗ 2−3 .
Ejercicio 6.9 Expresa el número real 12,37510 en binario usando notación científica.
Ejercicio 6.10 Expresa el número real 9,87510 en binario usando notación científica.
Ejercicio 6.11 Expresa el número real 112,7510 en binario usando notación científica.
Una vez hemos expresado el número real en binario usando notación científica, ya
podemos aplicar el estándar IEEE754. Este proceso lo veremos en las dos siguientes
secciones.
números con exponente desde -127 (expresado en binario como 0000 00002 ) hasta
128 (expresado en binario como 1111 11112 ).
Mantisa: La mantisa se codifica usando 23 bits, del 9 al 31. Puesto que todos los
números binarios expresados en notación científica empiezan por “1.”, solo se
almacenan los dígitos situados a la derecha de la coma. Al usar 23 bits, la última
potencia de 2 que se tiene en cuenta para expresar el número es 2−23 .
Ejemplo 6.7 Expresa el número 5,2510 en binario usando el estándar IEEE754 de 32
bits. Expresa el resultado final tanto en binario como en hexadecimal.
En primer lugar, convertimos a binario la parte entera y la parte fraccionaria del
número, obteniendo: 510 ≡ 1012 y 0,2510 ≡ 0,012 . Por lo tanto, 5,2510 ≡ 101,012 . El
siguiente paso consiste en expresar el número binario en notación científica: 101,012 →
1,01012 ∗ 22 . Por lo tanto, el signo es positivo, el exponente 210 y la mantisa 1,01012 .
El último paso consiste en codificar los tres elementos: signo, exponente y mantisa, tal
como se ha explicado anteriormente:
Signo: El signo será 0, puesto que es positivo.
Exponente: El exponente se codifica en Exceso Z, con Z = 127. Por lo tanto,
210 + 12710 = 12910 ≡ 1000 00012 con 8 bits.
Mantisa: Solo se codifica la parte fraccionaria de la mantisa, usando 23 bits, para
obtener: 010 1000 0000 0000 0000 00002 .
Finalmente, el número resultado es la unión de las tres partes, es decir el número
binario 0 1000 0001 010 1000 0000 0000 0000 00002 . Agrupando de cuatro en cuatro,
obtenemos 5,2510 ≡ 0100 0000 1010 1000 0000 0000 0000 00002 . En hexadecimal:
5,2510 ≡ 40A8000016
los números binarios expresados en notación científica empiezan por “1.”, solo
se almacenan los dígitos situados a la derecha de la coma, es decir la parte
fraccionaria de la mantisa. Al usar 52 bits, la última potencia de 2 que se tiene en
cuenta para expresar el número es 2−52 .
Ejemplo 6.8 Expresa el número 5,2510 en binario usando el estándar IEEE754 de 64
bits. Expresa el resultado final tanto en binario como en hexadecimal.
Como hemos visto en un ejemplo anterior 5,2510 ≡ 101,012 → 1,01012 ∗ 22 . Por
lo tanto, el signo es positivo, el exponente 210 y la mantisa 1,01012 . El último paso
es codificar los tres elementos: signo, exponente y mantisa, tal como se ha explicado
anteriormente:
Signo: El signo será 0, puesto que es positivo.
Exponente: El exponente se codifica en Exceso Z, con Z = 1023. Por lo tanto,
210 + 102310 = 102510 ≡ 100 0000 00012 con 11 bits.
Mantisa: Solo se codifica la parte fraccionaria de la mantisa, usando 52 bits, para
obtener: 0101 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 00002 .
Finalmente, el número resultado es la unión de las tres partes, es decir el número
binario:
0 100 0000 0001 0101 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 00002 .
Agrupando de cuatro en cuatro, obtenemos:
5,2510 ≡ 0100 0000 0001 0101 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 00002 .
En hexadecimal: 5,2510 ≡ 401500000000000016
Solución al ejercicio 6.9 Expresa el número real 12,37510 en binario usando nota-
ción científica.
El primer paso es convertir a binario la parte entera 1210 obteniendo 11002 . El
segundo paso es convertir a binario la parte fraccionaria 0,37510 , obteniendo 0,0112 .
Por lo tanto, 12,37510 ≡ 1100,0112 . Finalmente, expresamos el número binario
resultado usando notación científica obteniendo: 12,37510 ≡ 1,10001112 ∗ 23 .
Solución al ejercicio 6.10 Expresa el número real 9,87510 en binario usando nota-
ción científica.
El primer paso es convertir a binario la parte entera 910 obteniendo 10012 . El se-
gundo paso es convertir a binario la parte fraccionaria 0,87510 , obteniendo 0,1112 . Por
lo tanto, 9,87510 ≡ 1001,1112 . Finalmente, expresamos el número binario resultado
6.7 Soluciones a los ejercicios propuestos 71
Atención: [0000...] significa que el resto de símbolos son ceros hasta completar
los 52 bits.
Finalmente, el número resultado es la unión de las tres partes, es decir el número
binario:
0 100 0000 0010 1000 1100 [0000...]2 . Agrupando de cuatro en cuatro, obtenemos:
12,37510 ≡ 01000000001010001100 [0000...]2 .
En hexadecimal: 12,37510 ≡ 4028C0000000000016
7.1 Introducción
En los seis capítulos anteriores, se ha explicado en detalle como codificar en binario
números enteros y reales, tanto positivos como negativos. Los lenguajes de progra-
mación también incluyen texto para mostrar mensajes por la pantalla para facilitar o
requerir información al usuario del programa. Un texto se compone de una secuencia
de caracteres. Por ejemplo, el texto “Buenos días” se compone de 11 caracteres: ‘B’,
‘u’, ‘e’, ‘n’, ‘o’, ‘s’, ‘ ’, ‘d’, ‘í’, ‘a’y ‘s’. Como se puede comprobar, el término carác-
ter se refiere tanto a las letras que usamos para componer los mensajes (incluyendo
mayúsculas, minúsculas, vocales acentuadas, etc), como caracteres especiales como el
espacio. Existen multitud de caracteres para los que es necesario tener una codificación,
como por ejemplo los interrogantes, exclamaciones, los dígitos numéricos, letras griegas
(útiles para expresar fórmulas matemáticas), etc. Si tenemos en cuenta todos los posibles
símbolos que se pueden usar en cada idioma de entre los muchos existentes en la Tierra,
podemos comprender la dificultad de encontrar una forma de poder codificar todos los
símbolos existentes.
7.2 ASCII
El primer intento que se ideó para codificar caracteres es el código ASCII [Wik15a]
(acrónimo inglés de American Standard Code for Information Interchange). El código
ASCII es un código de caracteres basado en el alfabeto latino, tal como se usa en inglés
moderno. Cada carácter se codifica usando un byte, aunque en realidad solo se usan 7
bits, siendo el bit más significativo siempre cero. Al tener 7 bits, se puede representar
27 = 128 caracteres diferentes.
De los 128 posibles, los 32 primeros se usan para codificar caracteres no imprimibles,
de los cuales la mayoría son caracteres de control que tienen efecto sobre cómo se
procesa el texto. Los 95 siguientes son caracteres imprimibles (empezando por el
carácter espacio). El último código se usa para codificar el carácter DEL (tecla Delete
del teclado). Los caracteres de control no fueron pensados originalmente para representar
76 Capítulo 7. Codificación de caracteres alfanuméricos
información imprimible, sino para controlar dispositivos (como impresoras) que usaban
ASCII. Por ejemplo, el carácter codificado como 1010 representa la función “nueva
línea”, que hace que una impresora avance el papel, y el carácter codificado como
2710 representa la tecla “escape” que a menudo se encuentra en la esquina superior
izquierda de los teclados comunes. El paso del tiempo ha dejado obsoleto la mayoría de
los caracteres de control.
El carácter “espacio” (codificado como 3210 ), designa al espacio entre palabras, y
se produce normalmente por la barra espaciadora de un teclado. Los códigos del 3310
al 12610 se conocen como caracteres imprimibles, y representan letras, dígitos, signos
de puntuación y varios símbolos. La Figura 7.1 muestra los caracteres imprimibles del
código ASCII.
Tal como muestra la Figura 7.1, las mayúsculas y las minúsculas se diferencian en
únicamente 1 bit, en concreto el tercero (por la izquierda). Por ejemplo, el carácter ‘A’ se
codifica en binario como 0100 00012 (6510 en decimal), y su equivalente en minúsculas
‘a’ se codifica como 0110 00012 (9710 en decimal). Como se puede comprobar, dado
el código de una letra mayúscula, es muy sencillo obtener el de su equivalente en
minúsculas, añadiendo 32 en decimal, o reemplazar el “0” por el “1” en el tercer bit (por
la izquierda) del código en binario.
7.3 ISO latin 1 77
Los dígitos se codifican desde el ‘0’ como 0011 00002 (48 en decimal) hasta el ‘9’
como 0011 10012 (57 en decimal). Como se puede comprobar, los cuatro últimos de
la codificación ASCII coinciden con la codificación de los números enteros positivos
con N = 4. Es importante recalcar que, al igual que ocurría con la codificación de los
números con signo, hay que especificar como está codificado un conjunto de bits para
saber que significa dicho código. Por ejemplo, dado el código en binario 0101 01002 , si
estamos codificando un número sin signo, entonces 0101 01002 ≡ 8410 . Pero si estamos
codificando un carácter ASCII entonces 0101 01002 se refiere al carácter ‘T’. También
tenemos que darnos cuenta que no es lo mismo el número 710 que el carácter ‘7’. En el
primero de caso, es un número que podemos usar para realizar operaciones matemáticas.
En el segundo caso, es un carácter que podemos usar para mostrar texto.
Aunque el código ASCII supuso un gran avance en su momento, tiene una importante
limitación. Mirando la tabla de los caracteres imprimibles (Figura 7.1) podemos observar
que faltan muchos caracteres necesarios para escribir texto en idiomas diferentes al
inglés, como por ejemplo las vocales acentuadas, la letra ‘Ñ’, el interrogante abierto, etc.
Si pensamos en todos los idiomas de la tierra (como por ejemplo, el chino o el japonés,
entre muchos otros que no usan el alfabeto latino) podemos comprobar como los 7 bits
del ASCII no son suficientes para codificar todos los posibles caracteres de todos los
idiomas.
7.4 Unicode
Unicode [Wik15c] es un estándar de codificación de caracteres diseñado para facilitar
el tratamiento informático, transmisión y visualización de textos de múltiples lenguajes
y disciplinas técnicas, además de textos clásicos de lenguas muertas. El término Unicode
proviene de los tres objetivos perseguidos: universalidad, uniformidad y unicidad. En su
creación se perseguían tres objetivos:
Universalidad: Un repertorio suficientemente amplio que albergue a todos los
caracteres probables en el intercambio de texto multilingüe.
Eficiencia: Las secuencias generadas deben ser fáciles de tratar.
No ambigüedad: Un código dado siempre representa el mismo carácter.
La característica más importante es que Unicode especifica un nombre e identifi-
cador numérico único para cada carácter o símbolo existente. De esta forma todos los
caracteres posibles que se pueden usar, sea cual sea el idioma, tienen un código único.
La descripción completa del estándar y las tablas de caracteres están disponibles en la
página web oficial de Unicode (http://www.unicode.org/charts/).
Unicode incluye todos los caracteres de uso común en la actualidad. La versión
5.1 contenía 100 713 caracteres provenientes de alfabetos, sistemas ideográficos y
colecciones de símbolos (matemáticos, técnicos, musicales, iconos, etc.). La cifra crece
con cada versión. Unicode incluye sistemas de escritura modernos como: árabe, braille,
copto, cirílico, griego, sinogramas (hanja coreano, hanzi chino y kanji japonés), silabarios
japoneses (hiragana y katakana), hebreo y latino; escrituras históricas extintas, para
propósitos académicos, como por ejemplo: cuneiforme, griego antiguo, micénico, fenicio
y rúnico. Entre los caracteres no alfabéticos incluidos en Unicode se encuentran símbolos
musicales y matemáticos, fichas de juegos como el dominó, flechas, iconos, etc.
7.5 UTF-8
UTF-8 (8-bit Unicode Transformation Format) [Wik15d] es un formato de codifica-
ción de caracteres Unicode. UTF-8 divide los caracteres Unicode en varios grupos, en
función del número de bytes necesarios para codificarlos. El número de bytes depende
exclusivamente del código de carácter asignado por Unicode y del número de bytes
necesario para representarlo.
Las principales ventajas de UTF-8 es que permite codificar cualquier carácter Unico-
de. Además es compatible con la codificación ASCII original, puesto que la codificación
de los caracteres incluidos en ASCII es idéntica en UTF-8. Sin embargo, UTF-8 tiene la
desventaja de usar símbolos de longitud variable, eso significa que diferentes caracteres
pueden codificarse con distinto número de bytes.
siguiente paso es consultar las tablas Unicode para averiguar a que carácter corresponde
cada identificador. En este caso, son letras del alfabeto latino, por lo que ocupan un
único byte (codificadas en UTF-8). Mirando las tabla Unicode podemos averiguar que el
texto es “hello”. Para ello, podemos usar la web: http://unicode-table.com/es/,
donde podemos comprobar que el identificador para el carácter ‘h’ es 10410 (6816 ), para
el carácter ‘e’ es 10110 (6516 ) y así sucesivamente para el resto de caracteres.
Bibliografía
8. Referencias bibliográficas
Bibliografía
[Abc14] Abc.es. Psy y su Gangnam Style rompen el contador de visitas de YouTube.
2014. URL: http : / / www . abc . es / tecnologia / redes / 20141203 /
abci- gangnam- style- rompe- youtube- 201412031647.html (véase
página 48).
[Doc15] Java Documentation. Primitive Data Types. 2015. URL: http:/ /docs.
oracle . com / javase / tutorial / java / nutsandbolts / datatypes .
html (véase página 48).
[Wik14a] Wikipedia. Bit — Wikipedia, La enciclopedia libre. 2014. URL: http://es.
wikipedia.org/w/index.php?title=Bit&oldid=78206130 (véase
página 15).
[Wik14b] Wikipedia. Byte — Wikipedia, La enciclopedia libre. 2014. URL: http:
//es.wikipedia.org/w/index.php?title=Byte&oldid=78191575
(véase página 15).
[Wik14c] Wikipedia. Código (comunicación) — Wikipedia, La enciclopedia libre.
2014. URL: http://es.wikipedia.org/w/index.php?title=C%C3%
B3digo_(comunicaci%C3%B3n)&oldid=78395466 (véase página 7).
[Wik14d] Wikipedia. Desbordamiento aritmético — Wikipedia, La enciclopedia li-
bre. 2014. URL: http://es.wikipedia.org/w/index.php?title=
Desbordamiento _ aritm % C3 % A9tico & oldid = 75146595 (véase pági-
na 30).
[Wik14e] Wikipedia. ISO 8859-1 — Wikipedia, La enciclopedia libre. 2014. URL:
http : / / es . wikipedia . org / w / index . php ? title = ISO _ 8859 - 1 &
oldid=78565335 (véase página 77).
[Wik14f] Wikipedia. Notación posicional — Wikipedia, La enciclopedia libre. 2014.
URL : http://es.wikipedia.org/w/index.php?title=Notaci%C3%
B3n_posicional&oldid=77807321 (véase página 11).
82 Capítulo 8. Referencias bibliográficas