Tema02 Notas
Tema02 Notas
Tema02 Notas
Luis Rincón
1
Índice
1. Introducción.
2. Sistemas de representación numérica.
3. Aritmética binaria.
4. Sistemas de representación en coma fija.
5. Sistemas de representación en coma flotante.
6. Representación de caracteres alfanuméricos.
7. Representación de datos numéricos: texto frente a binario.
Los computadores procesan información, y en este tema vamos a estudiar los sistemas de
representación más utilizados en los computadores para representar información numérica y
alfanumérica.
Comenzaremos con una breve introducción, para después presentar los fundamentos básicos de la
representación numérica en diferentes bases de numeración, haciendo más hincapié en el sistema
binario y en las operaciones aritméticas realizadas en base 2.
Visto todo esto, pasaremos a estudiar los sistemas utilizados para representar datos numéricos
enteros (coma fija), y continuaremos analizando la representación en coma flotante, que dota al
computador de la posibilidad de manejar aproximaciones a los números reales.
Finalmente, presentaremos brevemente los códigos utilizados para representar información
alfanumérica, indicando además cómo se representan los strings, que son tiras o cadenas formadas
por una secuencia de caracteres.
2
Bibliografía
[PAT] D.A. PATTERSON, J.L. HENNESSY. Computer Organization and Design, 5th
ed. Morgan Kaufmann, 2014 (o la traducción española más reciente: Estructura y
Diseño de Computadores, 4ª ed. Reverté, 2011).
3
Índice
1. Introducción.
2. Sistemas de representación numérica.
3. Aritmética binaria.
4. Sistemas de representación en coma fija.
5. Sistemas de representación en coma flotante.
6. Representación de caracteres alfanuméricos.
7. Representación de datos numéricos: texto frente a binario.
4
Introducción
Codificación de la información digital
Los computadores manejan información binaria. Como un único bit tiene poca potencia expresiva, los
conceptos se expresan mediante grupos o secuencias de bits. El tamaño privilegiado en el
computador es la palabra, cuyo ancho depende del procesador concreto. Otro tamaño habitual es el
octeto, carácter o byte, que expresa el número de bits que se suelen usar para representar un
carácter.
Los sistemas de codificación establecen las reglas que definen la correspondencia entre cada
elemento de información y la secuencia de bits que constituye su código. Existen diferentes tipos de
sistemas de codificación: sistemas de codificación directa, por campos o por secuencias de códigos.
En los sistemas de codificación directa se establece una correspondencia biunívoca entre un
conjunto de símbolos y un conjunto de códigos binarios, de forma que con n dígitos binarios se
pueden representar 2n códigos binarios distintos, y, por ende, 2n conceptos diferentes. En general,
puede afirmarse que para representar d símbolos serán precisos n dígitos binarios, cumpliéndose que
d 2n, y por tanto n log2d .
Los sistemas de codificación por campos otorgan significados específicos a parte de la información
codificada. Esto sucede en la codificación de instrucciones, o en ciertos sistemas de representación
numérica, como los sistemas de representación con signo o en coma flotante.
En los sistemas de codificación por secuencias de códigos también se otorga significado específico
a partes de la información codificada, pero sucede que existen símbolos que están codificados
mediante secuencias de diferentes longitudes. Un ejemplo de estos sistemas lo constituyen los
códigos de Hamming, o los repertorios de instrucciones de longitud variable.
5
Índice
1. Introducción.
2. Sistemas de representación numérica.
3. Aritmética binaria.
4. Sistemas de representación en coma fija.
5. Sistemas de representación en coma flotante.
6. Representación de caracteres alfanuméricos.
7. Representación de datos numéricos: texto frente a binario.
6
Sistemas de representación numérica
Bases de representación
7
Sistemas de representación numérica
Ejemplo: conversión decimal → binario: 19,3
Para convertir un dato de decimal a binario, se trabaja separadamente con la parte entera y con la
parte fraccionaria.
Para la parte entera, se divide el dato original entre 2, y reservamos el resto. Después se divide el
cociente obtenido entre 2, y volvemos a reservar el resto. Se realizan divisiones sucesivas de los
cocientes entre 2, reservando todos los restos, hasta que obtenemos un cociente menor de 2. La
parte entera convertida a decimal se compone del último cociente y de todos los restos obtenidos,
leídos de abajo hacia arriba.
Para la parte fraccionaria, se realiza el producto de la misma por 2, y del resultado reservamos la
parte entera. Tomamos la parte fraccionaria del producto anterior y la volvemos a multiplicar por 2, y
volvemos a reservar la parte entera del resultado. Procedemos del mismo modo repetidas veces hasta
que el resultado del producto nos dé un número entero (ya que los siguientes productos serían todos
nulos), o hasta que hemos llegado al ancho máximo permitido. La conversión de la parte fraccionaria
será 0’a-1a-2a-3…, donde todos los a-i son las partes enteras de los productos realizados, leídos de
arriba hacia abajo.
Para realizar conversiones de base 10 a cualquier otra base b procederemos de igual modo, pero
dividiendo o multiplicando por la base b en vez de por 2.
8
Sistemas de representación numérica
Ejemplo: conversión binario → decimal: 10011,0100110012
p -1
N a
iq
i bi
Para convertir un dato binario a su representación decimal, no tenemos más que calcular la suma de
los productos de cada dígito por su peso. Para convertir a base 10 desde cualquier otra base,
procederemos de igual modo, si bien el peso asignado a cada dígito dependerá de la base utilizada,
que ya no será 2.
9
Sistemas de representación numérica
Equivalencia entre decimal, binario, octal y hexadecimal
Decimal 0 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16
Binario 0 1 10 11 100 101 110 111 1000 1001 1010 1011 1100 1101 1110 1111 10000
Octal 0 1 2 3 4 5 6 7 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
En esta diapositiva se muestra la comparación entre las primeras combinaciones de las bases más
habitualmente utilizadas: base 10, base 2, base 8 y base 16.
Existe un método sencillo para convertir datos de una base b1 a otra b2 si se cumple que b2=b1p :
cada p dígitos de la representación de b1 dan un único dígito de la representación en b2. Este método
puede usarse a la hora de convertir un número de decimal a binario con un elevado número de cifras.
Por ejemplo, el número X=23,1 tiene una parte fraccionaria que es periódica en binario. Por tanto, si
queremos transformarlo a binario cometiendo un error pequeño, tendríamos que obtener muchas
cifras para la parte fraccionaria. Supongamos que queremos sacar 24 cifras en la parte fraccionaria.
Entonces tendríamos que hacer 24 productos, lo cual es muy pesado. Obtendríamos el mismo
resultado si la parte fraccionaria la pasásemos a hexadecimal obteniendo 6 cifras (sólo 6 productos) y
utilizásemos la tabla de equivalencia para transformarla a binario (cuatro bits por cada dígito
hexadecimal).
10
Índice
1. Introducción.
2. Sistemas de representación numérica.
3. Aritmética binaria.
4. Sistemas de representación en coma fija.
5. Sistemas de representación en coma flotante.
6. Representación de caracteres alfanuméricos.
7. Representación de datos numéricos: texto frente a binario.
11
Aritmética binaria
Suma y resta
0 0 1
0 0 1 B
B
1 11 0
1 1 10
acarreo
1 acarreos 1 1 1 83 1 0 1 0 0 1 1 minuendo
9 1 0 0 1
15 + 1 1 1 1 - 21 - 1 0 1 0 1 sustraendo
+ acarreos 1 1 1 1
24 1 1 0 0 0 62 0 1 1 1 1 1 0 diferencia
Las operaciones de suma y resta en binario son muy sencillas, dado que hay muy pocas opciones que
contemplar.
Al sumar una pareja de dígitos se puede obtener un acarreo o llevada. Esto sucede cuando ambos
dígitos son 1. Ese acarreo se sumará a la pareja de dígitos que se encuentran inmediatamente a la
izquierda de la pareja que los generó.
Al restar una pareja de dígitos se puede producir un acarreo negativo o préstamo. Este acarreo se
restará a la pareja de dígitos que se encuentran inmediatamente a la izquierda de la pareja que los
generó.
Cuando la pareja de dígitos más significativos genera un acarreo, a éste se le llama acarreo de
orden superior.
Si se genera un acarreo de orden superior en una resta, significa que el sustraendo es mayor que el
minuendo.
12
Aritmética binaria
Producto
PRODUCTO A 12 1 1 0 0 multiplicando
BINARIO 0 1
() × 6 × 1 1 0 multiplicador
0 0 0 72 0 0 0 0
B
1 0 1 1 1 0 0 productos
parciales
1 1 0 0
1 0 0 1 0 0 0 resultado
M 64 + 8 = 72
× m
R M3 M2 M1 M0 multiplicando
× m2 m1 m0 multiplicador
M3ꞏm0 M2 ꞏm0 M1 ꞏm0 M0 ꞏm0
productos
M3ꞏm1 M2 ꞏm1 M1 ꞏm1 M0 ꞏm1 parciales
M3ꞏm2 M2 ꞏm2 M1 ꞏm2 M0 ꞏm2
R6 R5 R4 R3 R2 R1 R0 resultado
13
Aritmética binaria
División
0 14 - 1 0 0 0 1 1 1 0 cociente
0 1 1 0 0
- 1 0 0 0
restos parciales 0 1 0 0 0
- 1 0 0 0
0 0 0 0 0
- 0 0 0 0
0 0 0 0 resto final
La única dificultad de la división está en realizar las restas para obtener los restos parciales y final. La
obtención de cada uno de los dígitos de cociente es muy simple.
14
Índice
1. Introducción.
2. Sistemas de representación numérica.
3. Aritmética binaria.
4. Sistemas de representación en coma fija.
5. Sistemas de representación en coma flotante.
6. Representación de caracteres alfanuméricos.
7. Representación de datos numéricos: texto frente a binario.
Vamos a estudiar los sistemas de representación más comunes en los computadores, comenzando
con los sistemas en coma fija, utilizados para representar números enteros con o sin signo.
La precisión de un sistema de representación es el número de bits utilizado para representar los
datos numéricos. El hardware de los computadores no trabaja con datos de ancho arbitrario, sino que
es capaz de trabajar únicamente con una o varias precisiones determinadas.
El rango de un sistema de representación es el conjunto de cantidades que es capaz de representar.
El rango está directamente relacionado con la anchura de los datos representados (n bits).
Como el rango es limitado, al operar con dos datos se puede obtener un resultado que esté fuera del
mismo. En este caso diremos que se ha producido desbordamiento (overflow) en la operación.
Cuando hay varios anchos de representación se puede realizar la operación de extensión de signo,
que consiste en pasar una cantidad representada con n bits a representarla con m bits, siendo m>n.
La resolución de un sistema de representación es la diferencia entre dos cantidades consecutivas
representables en el sistema. En sistemas de coma fija, la resolución es fija a lo largo de todo el
rango de cantidades representables, y es igual al peso del dígito menos significativo. Si se usan p bits
para la parte entera y q bits para la fraccionaria (p+q=n), la resolución será 2-q. Si q=0, entonces
los n bits se utilizarán para representar números enteros, y la resolución será 1, con lo que no se
cometerán errores en las operaciones realizadas, a no ser que se produzca desbordamiento.
Estudiaremos los siguientes sistemas de representación numérica en coma fija:
• Números sin signo: binario puro o binario natural.
• Números con signo:
Módulo y signo o signo-magnitud.
Complemento a 1.
Complemento a 2.
Exceso a M (representación con sesgo).
15
Sistemas de representación en coma fija
Binario puro (repaso)
16
Sistemas de representación en coma fija
Módulo y signo o signo-magnitud (repaso)
17
Sistemas de representación en coma fija
Complemento a 1 (repaso)
20
Sistemas de representación en coma fija
Cuadro resumen de coma fija
Aquí se presenta un cuadro comparativo de los sistemas más comúnmente utilizados a la hora de
representar números en coma fija sin parte fraccionaria.
Lo más habitual es que los números enteros con signo se representen en complemento a 2. Este
sistema presenta la ventaja de que los números se pueden sumar directamente, y que para hacer la
resta basta con sumar el minuendo con el complementario del sustraendo. Al no tener doble
representación del 0, el resultado obtenido en la operación es siempre correcto, salvo que exceda el
rango de representación del sistema.
21
Índice
1. Introducción.
2. Sistemas de representación numérica.
3. Aritmética binaria.
4. Sistemas de representación en coma fija.
5. Sistemas de representación en coma flotante.
6. Representación de caracteres alfanuméricos.
7. Representación de datos numéricos: texto frente a binario.
22
Sistemas de representación en coma flotante
Notación científica y normalización
La notación científica es el sistema utilizado por los científicos para representar cantidades numéricas
de forma que sean fácilmente expresables (una mantisa M con un formato sencillo) y comparables (la
mantisa va multiplicada por 10 elevado a un exponente exp).
Los números en notación científica se expresan del siguiente modo: X = M · 10exp. Tanto la mantisa
como el exponente pueden ser positivos o negativos. El signo de X es el signo de la mantisa,
mientras que el signo del exponente indica si X es un número cuyo valor absoluto es grande
(positivo) o pequeño (negativo).
La mantisa es una cantidad que tiene parte entera y parte fraccionaria. Para hacer las cosas más
sencillas, la notación científica utiliza mantisa normalizada, lo cual significa que la coma que separa
las dos partes de la misma está en un lugar determinado de antemano, que suele ser a la derecha del
primer dígito significativo (mantisas entre 1 y 9,99999…) o a la izquierda del primer dígito significativo
(mantisas entre 0 y 0,99999…).
Si las mantisas están normalizadas, entonces es muy fácil comparar cantidades para ver para ver cuál
tiene mayor valor absoluto. Cuando el exponente de la cantidad X es mayor que el de la cantidad Y,
entonces |X| > |Y|, y si los exponentes de ambas cantidades son iguales, entonces el mayor
módulo viene dado por la mayor mantisa.
23
Sistemas de representación en coma flotante
Características de los sistemas de coma flotante
La coma flotante (floating point) es un sistema que representa números en el computador de forma
similar a como se representan números en notación científica: con una mantisa que va multiplicada
por la base elevada a un exponente entero. Evidentemente, aquí la base es 2. A menudo se tratan
por separado el signo s y el módulo |M| de la mantisa, así que los números en coma flotante se
suelen expresar sobre papel como X = M · 2exp = (-1)s · |M| · 2exp.
El exponente (exp) es un entero expresado en coma fija, y puede ser positivo o negativo. El
conjunto signo-mantisa (M) también se expresa en coma fija, pero la mantisa tiene parte
fraccionaria y está normalizada. En números positivos, s=0, y en números negativos, s=1. Las
normalizaciones más frecuentes para la mantisa son (en negrita aparece el bit más significativo):
• Coma a la izquierda del bit más significativo (0 < |M| < 1): 0,1xxxx…
• Coma a la derecha del bit más significativo (1 |M| < 2): 1,xxx…
El bit más significativo de una mantisa no nula siempre vale 1. Si usamos normalización, dicho bit
ocupa una posición conocida, y no se suele almacenar internamente, dando lugar a la técnica del bit
implícito (bit que no se almacena pero que se incorpora a la hora de hacer operaciones).
Si la mantisa está normalizada siempre tiene algún bit a 1, por lo que no se puede representar el
número X=0.
Si mp y Mp son la menor y mayor mantisa positiva, -mn y -Mn son mayor y menor mantisa negativa,
y exp y Exp son los exponentes menor y mayor respectivamente, el rango de los números positivos
representables será [mp · 2exp, Mp · 2Exp], y el de los negativos será [-Mn · 2Exp, -mn · 2exp].
Así, el rango total de cantidades representables será [-Mn · 2Exp, -mn · 2exp] [mp · 2exp, Mp · 2Exp].
Se observa entonces que en un sistema de coma flotante con mantisa normalizada, existe un hueco
alrededor del 0 formado por cantidades que no se pueden representar, y que es (-mn · 2exp, mp · 2exp).
24
Sistemas de representación en coma flotante
IEEE 754 precisión simple (32 bits)
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
S EXPONENTE MANTISA
0 si exp = m = 0
N=
+∞ si exp = 255, m = 0, s = 0
–∞ si exp = 255, m = 0, s = 1
s = signo de la mantisa
m = módulo de la mantisa almacenada (sin bit implícito)
exp = exponente almacenado (sin descontar exceso)
25
Sistemas de representación en coma flotante
IEEE 754 precisión doble (64 bits)
63 62 61 60 59 58 57 56 55 54 53 52 51 50 49 48 47 46 45 44 43 42 41 40 39 38 37 36 35 34 33 32
S EXPONENTE MANTISA
31 30 29 28 27 26 25 24 23 22 21 20 19 18 17 16 15 14 13 12 11 10 9 8 7 6 5 4 3 2 1 0
MANTISA (CONTINUACIÓN)
0 si exp = m = 0
N=
+∞ si exp = 2047, m = 0, s = 0
–∞ si exp = 2047, m = 0, s = 1
Cuando el exponente es 00000000, el número está sin normalizar. Se pueden dar dos situaciones,
contempladas como casos especiales en la representación:
• Si la mantisa tiene todos sus bits a 0, entonces estamos ante la representación del 0 (que
puede ser dual, porque puede llevar signo positivo o negativo).
• Si la mantisa es distinta de 0, entonces el valor del número representado es (-1)s · 0,m · 2-
126, y dicha mantisa estará sin normalizar (es decir, que el primer dígito distinto de 0 puede
26
Sistemas de representación en coma flotante
Ejemplo de conversión de IEEE 754 precisión simple a base 10
N = C0A0000016,IEEE754,s =
= 1100 0000 1010 0000 0000 0000 0000 00002,IEEE754,s
s exp m
Para escribir la representación interna de un número en coma flotante deberíamos escribir una
secuencia de 32 bits. Para hacer las cosas más sencillas, se utiliza la llamada representación
compacta hexadecimal, que consiste en tomar los bits de la representación interna del número de
cuatro en cuatro, y traducir cada uno de estos grupos de 4 a su representación hexadecimal.
Si queremos saber cuáles son los valores de los campos de la representación, debemos recuperar
todos los bits traduciendo de hexadecimal a binario, y después separarlos en sus campos: el primer
bit es el signo de la mantisa, los ocho siguientes son la representación binaria del exponente, y los 23
siguientes son la parte fraccionaria de la mantisa.
Este ejemplo corresponde con un caso normalizado, con exponente distinto de 00000000 y 11111111.
Por tanto, su valor se obtiene mediante la fórmula para casos normalizados: la parte entera de la
mantisa es un 1 que no está almacenado (bit implícito) y el exponente está en exceso a 127 (hay que
restar el exceso para conocer su valor).
27
Sistemas de representación en coma flotante
Ejemplo de conversión de IEEE 754 precisión simple a base 10
N = 4237000016,IEEE754,s =
= 0100 0010 0011 0111 0000 0000 0000 00002,IEEE754,s
s exp m
Este ejemplo también corresponde con un número normalizado, y se resuelve de igual manera que el
anterior.
28
Sistemas de representación en coma flotante
Ejemplo de conversión de IEEE 754 precisión simple a base 10
N = C425A00016,IEEE754,s =
= 1100 0100 0010 0101 1010 0000 0000 00002,IEEE754,s
s exp m
Este ejemplo también corresponde con un número normalizado, y se resuelve de igual manera que el
anterior.
29
Sistemas de representación en coma flotante
Ejemplo de conversión de IEEE 754 precisión simple a base 10
N = 004B000016,IEEE754,s =
= 0000 0000 0100 1011 0000 0000 0000 00002,IEEE754,s
s exp m
Este ejemplo corresponde con un número sin normalizar, ya que el exponente es 00000000. Dado que
la mantisa tiene bits a 1, entonces se aplica la fórmula para números desnormalizados, con la parte
entera de la mantisa igual a 0, y el exponente igual a -126.
30
Sistemas de representación en coma flotante
Ejemplo de conversión de IEEE 754 precisión simple a base 10
N = 8000000016,IEEE754,s =
= 1000 0000 0000 0000 0000 0000 0000 00002,IEEE754,s
s exp m
Este ejemplo corresponde con un número sin normalizar, ya que el exponente es 00000000. Dado que
la mantisa tiene todos sus bits a 0, entonces estamos ante la representación del 0.
31
Sistemas de representación en coma flotante
Ejemplo de conversión de IEEE 754 precisión simple a base 10
N = 7F80000016,IEEE754,s =
= 0111 1111 1000 0000 0000 0000 0000 00002,IEEE754,s
s exp m
Este ejemplo corresponde con un caso especial, ya que su exponente es 11111111. Como todos los
bits de la mantisa con 0, y el signo de la misma es positivo, tenemos el +∞.
32
Sistemas de representación en coma flotante
Ejemplo de conversión de IEEE 754 precisión simple a base 10
N = FF80040016,IEEE754,s =
= 1111 1111 1000 0000 0100 0000 0000 00002,IEEE754,s
s exp m
Este ejemplo corresponde con un caso especial, ya que su exponente es 11111111. Como la mantisa
tiene bits a 1, entonces tenemos un NaN (“Not a Number”).
33
Sistemas de representación en coma flotante
Ejemplo de conversión de base 10 a IEEE 754 precisión simple
N = –0,7510
1. Expresarlo en binario: –0,7510 = –0,112
2. Normalizar: –0,112 = –1,12×2–1
3. Cálculo del exponente en exceso:
exp = –110 + 12710 = 12610,exc.127 = 011111102,exc.127
4. Cálculo de mantisa:
m = 1,10000000000000000000000 (el bit implícito no se almacena)
5. Bit de signo: s = 1 (nº negativo)
6. Representación en precisión simple:
1 0 1 1 1 1 1 1 0 1 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0
S EXPONENTE MANTISA
Para convertir un número de decimal a coma flotante, tenemos que convertirlo a binario con el
formato ±M.2exp, estando la mantisa normalizada en el rango [1,2). Entonces se obtendrán los valores
de los campos de signo, mantisa y exponente, y cada uno se convierte al tipo de representación que
le corresponde: la mantisa se pone en magnitud-signo (eliminando la parte entera de la misma, que
es el bit implícito), y el exponente en exceso a 127 (sumándole el exceso).
34
Sistemas de representación en coma flotante
Errores de representación y técnicas de redondeo
R5 R2
R4 R6 R1 R3
- +
Cuando se aplica la técnica de redondeo hacia 0, también denominada redondeo por truncamiento
o simplemente truncamiento, basta con eliminar los bits que no caben en la representación. Por
tanto, si una cierta cantidad R se encuentra en el interior del intervalo (Xi,Xi+1), será representada
por aquélla que tiene menor valor absoluto (la que está más cerca del 0).
Veamos un ejemplo. Sea el número X=23,1, el cual queremos representar según el estándar IEEE
754 de precisión simple. Al pasarlo a binario con 25 bits para la parte fraccionaria tenemos que
X=10111,0001100110011001100110011…2
Esta es una cantidad periódica, con lo cual no existe ningún sistema en coma flotante binaria que
pueda representarlo de forma exacta. Al normalizarlo obtenemos que
X≈1,011100011001100110011001100112 · 24
donde hay varios dígitos sobrantes (dígitos de redondeo) que aparecen en cursiva.
Se observa que X está dentro del intervalo
(1,011100011001100110011002 · 24 , 1,011100011001100110011012 · 24)
Con redondeo hacia 0, eliminamos los dígitos de redondeo, con lo que la aproximación de X será
X’=1,011100011001100110011002 · 24
Ordenados sus campos y añadiendo el bit de signo tendremos la siguiente representación:
0 10000011 01110001100110011001100
Utilizando la notación compacta hexadecimal, el número representado será 41B8CCCC.
Con X=-23,1 sólo cambiaría el bit de signo, y su codificación sería
1 10000011 01110001100110011001100
Con notación hexadecimal, el número representado sería C1B8CCCC.
36
Sistemas de representación en coma flotante
Redondeo hacia +∞
R5 R2
R4 R6 R1 R3
- +
Cuando se aplica la técnica de redondeo hacia +∞, también denominada redondeo por exceso,
si una cierta cantidad R se encuentra en el interior del intervalo (Xi,Xi+1), será representada por el
extremo derecho del intervalo, es decir, por Xi+1. En caso de que R sea positivo, Xi+1 es el extremo
con mayor valor absoluto, mientras que si R es negativo, Xi+1 es el extremo más cercano a 0.
Para X=23,1, su representación binaria era X≈1,011100011001100110011001100112 · 24, y sabemos
que está dentro del intervalo
(1,011100011001100110011002 · 24 , 1,011100011001100110011012 · 24)
Entonces, su representación aproximada con redondeo por exceso será
X’=1,011100011001100110011012 · 24
Ordenados sus campos y añadiendo el bit de signo tendremos la siguiente representación:
0 10000011 01110001100110011001101
Utilizando la notación compacta hexadecimal, el número representado será 41B8CCCD.
Si X=-23,1, el intervalo será
(-1,011100011001100110011012 · 24 , -1,011100011001100110011002 · 24)
Y entonces, usando redondeo por exceso, X se aproximará por
X’=-1,011100011001100110011002 · 24
Ordenados sus campos y añadiendo el bit de signo tendremos la siguiente representación:
1 10000011 01110001100110011001100
Utilizando la notación compacta hexadecimal, el número representado será C1B8CCCC.
37
Sistemas de representación en coma flotante
Redondeo hacia -∞
R5 R2
R4 R6 R1 R3
- +
Cuando se aplica la técnica de redondeo hacia -∞, también denominada redondeo por defecto, si una
cierta cantidad R se encuentra en el interior del intervalo (Xi,Xi+1), será representada por el extremo
izquierdo del intervalo, es decir, por Xi. En caso de que R sea positivo, Xi es el extremo con menor
valor absoluto, mientras que si R es negativo, Xi es el extremo con mayor valor absoluto, es decir, el
más lejano a 0.
Para X=23,1, su representación binaria era X≈1,011100011001100110011001100112 · 24, y sabemos
que está dentro del intervalo
(1,011100011001100110011002 · 24 , 1,011100011001100110011012 · 24)
Entonces, con redondeo por defecto su representación aproximada es
X’=1,011100011001100110011002 · 24
Ordenados sus campos y añadiendo el bit de signo tendremos la siguiente representación:
0 10000011 01110001100110011001100
Utilizando la notación compacta hexadecimal, el número representado será 41B8CCCC.
Si X=-23,1, el intervalo será
(-1,011100011001100110011012 · 24 , -1,011100011001100110011002 · 24)
Y entonces, usando redondeo por defecto, X se aproximará por
X’=-1,011100011001100110011012 · 24
Ordenados sus campos y añadiendo el bit de signo tendremos la siguiente representación:
1 10000011 01110001100110011001101
Utilizando la notación compacta hexadecimal, el número representado será C1B8CCCD.
38
Sistemas de representación en coma flotante
Redondeo al valor más próximo (I)
Xi Xi+1
XM
39
Sistemas de representación en coma flotante
Redondeo al valor más próximo (II)
R5 R2
R4 R6 R1 R3
- +
Bits sobrantes 1X...X Bits sobrantes 0X...X Bits sobrantes 0X...X Bits sobrantes 1X...X
con algún X<>1 Se aproxima por Xj+1 Se aproxima por Xi con algún X<>1
Se aproxima por Xj Se aproxima por Xi+1
Entonces:
• Si R está en la mitad izquierda del intervalo, se aproximará por el extremo izquierdo Xi , que
es el más cercano, con lo que el error absoluto cometido se minimiza.
• Si R está en la mitad derecha del intervalo, se aproximará por el extremo derecho Xi+1 , que
en este caso será el más cercano, minimizándose también el error absoluto.
• Si R está en el centro del intervalo, se cometería el mismo error al aproximarlo por un
extremo o por el otro. El estándar IEEE 754 dice que en este caso R se aproximará por
aquél de los dos extremos cuya mantisa termine por 0.
Para X=23,1, su representación binaria era X≈1,011100011001100110011001100112 · 24. Se observa
que el primer bit sobrante es 1, y hay más bits sobrantes que valen 1, por lo cual X se encuentra en
la mitad derecha del intervalo, y con redondeo al valor más próximo debe ser representado por el
extremo derecho del mismo. Entonces su representación aproximada es
X’=1,011100011001100110011012 · 24
Ordenados sus campos y añadiendo el bit de signo tendremos la siguiente representación:
0 10000011 01110001100110011001101
Utilizando la notación compacta hexadecimal, el número representado será 41B8CCCD.
Si X=-23,1, con redondeo al valor más próximo se aproximará por
X’=-1,011100011001100110011012 · 24
Ordenados sus campos y añadiendo el bit de signo tendremos la siguiente representación:
1 10000011 01110001100110011001101
Utilizando la notación compacta hexadecimal, el número representado será C1B8CCCD.
Cuando se utiliza redondeo al valor más próximo, la cota del error absoluto se reduce a la mitad, ya
que el error cometido es siempre inferior a la mitad del ancho del intervalo (Xi,Xi+1).
40
Sistemas de representación en coma flotante
Ejemplo de conversión de base 10 a IEEE 754 precisión simple
N = –23,110
1. Expresarlo en binario: –23,110 –10111,00011001100110011001100112
2.a. Normalizar:
-10111,00011001100110011001100112 -1,01110001100110011001100110011×24
2.b. Redondear al valor más próximo:
-1,01110001100110011001100110011×24 -1,01110001100110011001101×24
3. Cálculo del exponente en exceso:
exp = 410 + 12710 = 13110,exc.127 = 100000112,exc.127
4. Cálculo de mantisa:
m = 1,01110001100110011001101 (el bit implícito no se almacena)
5. Bit de signo: s = 1 (nº negativo)
6. Representación en precisión simple:
1 1 0 0 0 0 0 1 1 0 1 1 1 0 0 0 1 1 0 0 1 1 0 0 1 1 0 0 1 1 0 1
S EXPONENTE MANTISA
Cuando tengamos que realizar la conversión de una cantidad que no pueda representarse de forma
exacta, obtendremos bits de sobra para la mantisa y aplicaremos redondeo al valor más próximo.
Puede suceder que, al redondear la mantisa, la cantidad quede desnormalizada, con lo cual habría
que repetir de nuevo los pasos de normalización y redondeo.
41
Sistemas de representación en coma flotante
Ejemplo de conversión de base 10 a IEEE 754 precisión simple
N = 2,567510 x 1015
1. Expresarlo en binario: 2,567510 x 1015 1,23E415A16 x 251 =
= 1,00100011111001000001010110102 x 251
2.a. Normalizar: 1,00100011111001000001010110102 x 251 está normalizado.
2.b. Redondear al valor más próximo:
1,00100011111001000001010110102 x 251 1,001000111110010000010112 x 251
3. Cálculo del exponente en exceso:
exp = 5110 + 12710 = 17810,exc.127 = 101100102,exc.127
4. Cálculo de mantisa:
m = 1,00100011111001000001011 (el bit implícito no se almacena)
5. Bit de signo: s = 0 (nº positivo)
6. Representación en precisión simple:
0 1 0 1 1 0 0 1 0 0 0 1 0 0 0 1 1 1 1 1 0 0 1 0 0 0 0 0 1 0 1 1
S EXPONENTE MANTISA
Aquí el problema está en la conversión de la cantidad inicial a binario. Supongamos, sin pérdida de
generalidad, que N es positivo (si fuera negativo, usaríamos su valor absoluto y pondríamos s=1 en el
paso 5 de la conversión). El objetivo será poner N en el formato 𝑁 𝑀 2 (ecuación 1), donde
1 |𝑀| 2 y 𝑒𝑥𝑝 ∈ ℤ , es decir, exp será un número entero. Así la mantisa estará ya normalizada y la
conversión resultará muy sencilla.
Lo primero será averiguar el valor de exp. Podemos hacer 𝑁 2 (ecuación 2), donde
𝑒𝑥𝑝 𝐸𝑥𝑝 (parte entera de Exp) (ecuación 3). Entonces se cumplirá que 𝐸𝑥𝑝 𝑝 𝑒𝑥𝑝, donde
𝑝 ∈ 0,1 , y 𝑁 2 2 2 2 (ecuación 4). Aplicando logaritmos a la ecuación 2,
ln 𝑁 ln 2 𝐸𝑥𝑝 ln 2, y despejando obtenemos que 𝐸𝑥𝑝 . Introduciendo esta expresión
en la ecuación 3, vemos que el valor del exponente es 𝑒𝑥𝑝 (ecuación 5), es decir, que el
exponente se calculará como la parte entera del cociente del logaritmo de N por el logaritmo de 2.
Igualando las ecuaciones 1 y 4, 𝑁 𝑀 2 2 2 (ecuación 6). Comparando ambos
términos de la igualdad, vemos que 𝑀 2 con 𝑀 ∈ 1,2 , ya que 𝑝 ∈ 0,1 , y M estará normalizada.
Para saber el valor de M usaremos la ecuación 1. Como conocemos el valor de exp, basta con
despejar la mantisa: 𝑀 (ecuación 7).
En resumen, antes de hacer el paso a binario pondremos 𝑁 𝑀 2 , y calcularemos M y exp
mediante las siguientes expresiones:
• 𝑒𝑥𝑝 (ecuación 5).
• 𝑀 (ecuación 7).
A partir de aquí, pasaremos a binario la mantisa (quizá usando la conversión a hexadecimal como
paso intermedio), y continuaremos por el paso 2 de normalización y redondeo.
42
Sistemas de representación en coma flotante
Ejemplo de conversión de base 10 a IEEE 754 precisión simple
N = -6,8876610 x 10-39
1. Expresarlo en binario: -6,8876610 x 10-39 -1,2BFFF9A16 x 2-127 =
= -1,00101011111111111111100110102 x 2-127
2.a. Normalizar: -1,00101011111111111111100110102 x 2-127 está normalizado.
2.b. Redondear al valor más próximo:
-1,00101011111111111111100110102 x 2-127 -1,001010111111111111111012 x 2-127
El exponente queda fuera de rango, por tanto estamos ante un caso especial con
exponente igual a -126 y mantisa desnormalizada:
-0,100101011111111111111100110102x2-126 -0,100101011111111111111102 x 2-126
3. Exponente: 00000000
4. Cálculo de mantisa:
m = 0,10010101111111111111110 (no hay bit implícito)
5. Bit de signo: s = 1 (nº negativo)
6. Representación en precisión simple:
1 0 0 0 0 0 0 0 0 1 0 0 1 0 1 0 1 1 1 1 1 1 1 1 1 1 1 1 1 1 1 0
S EXPONENTE MANTISA
43
Sistemas de representación en coma flotante
Ejemplo de conversión de base 10 a IEEE 754 precisión simple
N = 4,510 x 10100
1. Expresarlo en binario: 4,510 x 10100 1,492E2CA16 x 2334 =
= 1,010010010010111000101100102 x 2334
En este caso la cantidad es excesivamente grande, y no puede representarse en el estándar IEEE 754
de precisión simple.
44
Sistemas de representación en coma flotante
Operaciones de suma y resta
No
Infinito positivo
¿Exponente menor Sí o negativo
que el mínimo?
No
Representar número en
Redondear la forma desnormalizada
mantisa resultante
No ¿Todavía está
normalizada?
Sí
Fin
La suma y la resta en coma flotante son operaciones complejas que constan de una serie de etapas:
1. Lo primero es desempaquetar los operandos, dividiéndolos en campos (conjunto signo-
mantisa y exponente). Esta tarea implica añadir el bit implícito al principio de la mantisa.
2. Seguidamente se realiza la alineación de las mantisas, para que ambas cantidades tengan el
mismo exponente, dado que de no hacerlo sería imposible sumarlas o restarlas. Para ello, se toma
la cantidad con menor exponente, y se desplaza su mantisa hacia la derecha tantos lugares como
sea necesario, ajustando el exponente hasta que es igual al de la cantidad con exponente mayor.
Dicho de otro modo, se calcula 𝑘 𝑒𝑥𝑝 𝑒𝑥𝑝 y después se desplaza k lugares a la derecha la
mantisa del número con menor exponente.
3. En este paso se realiza la suma o la resta de las mantisas, según de la operación seleccionada y
los signos de ambas. El exponente del resultado será el exponente mayor de los dos operandos.
4. Después se normaliza la mantisa resultante. En este paso quizá sea preciso ajustar el exponente.
5. Ahora hay que comprobar si el exponente del resultado está dentro del rango permitido. Si es
demasiado grande, el resultado será +∞ ó -∞, dependiendo del signo del resultado. Si es
demasiado pequeño, se produce subdesbordamiento, y entonces será preciso representar el
resultado en forma desnormalizada. En ambos casos, se calculan los campos de signo, exponente
y mantisa, se empaquetan y la operación termina.
6. Si el exponente del resultado está dentro de rango, el siguiente paso consiste en redondear la
mantisa. Esto puede provocar que se desnormalice, con lo cual sería preciso un proceso de
postnormalización, volviendo al paso 4.
7. Para terminar, se empaquetan los campos en el orden requerido, apartando el bit implícito, que no
formará parte de la representación final del resultado.
En la diapositiva se muestra un ejemplo de suma de dos números en notación científica.
45
Sistemas de representación en coma flotante
Ejemplo de suma de dos cantidades dadas en IEEE 754 precisión simple
Esta diapositiva muestra un ejemplo de suma de dos números en coma flotante IEEE 754 de precisión
simple. Se observa que B tiene menor exponente que A, con lo cual al alinear las mantisas y sumar
quedan 5 bits sobrantes, que se utilizarán para redondear. El exponente del resultado es el exponente
de A. En el paso de normalización podría haber sido necesario ajustar dicho exponente, pero en este
caso no ha hecho falta.
Al sumar se comete un error absoluto en el resultado que es menor que 2-23+5=2-18, es decir, es
menor que el peso del bit menos significativo de la mantisa multiplicado por el exponente. Como
hemos hecho redondeo al valor más próximo, en realidad el error absoluto es menor que la mitad de
dicho valor, con lo que finalmente ea < 2-17.
Se recomienda convertir A y B a base 10 y sumarlas, y comparar el resultado con R, comprobando los
errores absoluto y relativo cometidos.
En ocasiones se dan circunstancias curiosas, dependiendo del valor comparado de los operandos.
Como ejemplo, se propone realizar la suma de los números X=7F40000016 e Y= 6940000016 , ambos
representados en IEEE 754 de precisión simple con notación compacta hexadecimal, y analizar el
error absoluto y relativo cometidos en tal operación.
46
Sistemas de representación en coma flotante
Operaciones de producto y división
Inicio
A m a 2expa
exp b
R p A B m a m b 2expa expB
Sumar/restar los B mb 2
exponentes
A m a 2expa A m
Multiplicar/dividir las
exp b
R d a 2expa expB
mantisas
B mb 2 B mb
Normalizar la mantisa
resultante • Ejemplo en notación científica: A · B,
con 3 cifras fraccionarias en la mantisa
Sí
¿Exponente mayor
que el máximo?
A = 4,538 · 104 ---- B = 6,471 · 102
1. Sumar exponentes
No
Infinito positivo Exp’R = 4+2 = 6
¿Exponente menor Sí o negativo 2. Multiplicar mantisas
que el mínimo?
M’R = MA·MB = 4,538 · 6,471 =
No
Representar número en
= 29,365398
Redondear la forma desnormalizada 3. Normalizar mantisa resultante
mantisa resultante
MR = 2,9365398
¿Todavía está
ExpR = 6+1 = 7
No
normalizada? 4. Redondear mantisa del resultado
Sí MR = 2,9365398 ≈ 2,937
5. Resultado
Fin A·B ≈ 2,937 · 107
47
Índice
1. Introducción.
2. Sistemas de representación numérica.
3. Aritmética binaria.
4. Sistemas de representación en coma fija.
5. Sistemas de representación en coma flotante.
6. Representación de caracteres alfanuméricos.
7. Representación de datos numéricos: texto frente a binario.
48
Representación de caracteres alfanuméricos
Sistemas de representación alfanumérica
La diapositiva muestra una captura de pantalla del editor de textos Notepad++, que soporta múltiples
sistemas de codificación alfanumérica.
El código ANSI hace referencia al ASCII extendido de 8 bits.
Los sistemas BOM (byte ordering mode) permiten utilizar codificaciones con varios bytes por carácter
ordenándolos de diferentes modos. Los sistemas BE (big endian) tienen el byte más significativo
primero, mientras que los LE (little endian) tienen delante el byte menos significativo.
UCS-2 es el sistema Unicode original de longitud fija de 16 bits.
50
Representación de caracteres alfanuméricos
Tabla de caracteres ASCII extendidos ISO 8859-1
Esta es la tabla de caracteres ASCII extendido para variaciones nacionales ISO 8859-1 ó Latin-1. La
mitad superior corresponde con el US-ASCII, y la mitad inferior con la parte extendida. La codificación
de los caracteres se obtiene mediante la suma de la etiqueta de fila más la de columna. En la tabla
estas etiquetas aparecen en hexadecimal y en decimal. Por ejemplo, la codificación del carácter ‘a’ se
obtiene sumando su etiqueta de fila (96 en decimal) con la de columna (1), así que la codificación de
la ‘a’ corresponde con el número 96+1=97. Si miramos las etiquetas hexadecimales, veremos que son
60 y 1 respectivamente, con lo cual la codificación del carácter ‘a’ en hexadecimal es 61, y desde ésta
es más fácil obtener la codificación binaria, que es 01100001. Al espacio en blanco, por su parte, le
corresponde el ordinal decimal 32 (20 hex y 00100000 binario).
Se observa que las codificaciones de las letras del alfabeto minúsculas y sus correspondientes
mayúsculas difieren en un único bit. Lo mismo sucede con la ‘ñ’ (F1 hexadecimal) y la ‘Ñ’ (D1
hexadecimal), que están en la parte extendida, o con ‘?’ (3F hexadecimal) y ‘¿’ (BF hexadecimal), y
con ‘!’ (21 hexadecimal) y ‘¡’ (A1 hexadecimal).
Las cifras del ‘0’ al ‘9’ se corresponden con los códigos hexadecimales del 48 (30 en hexadecimal,
00110000 en binario) al 57 (39 en hexadecimal, 00111001 en binario).
Los caracteres de las dos primeras filas son caracteres de control. Estos caracteres no son
imprimibles, y representan informaciones importantes. Destacaremos el carácter nulo (NUL), cuyo
ordinal es 00000000, y que muchas veces se representa como ‘\0’. También están el salto de línea
(LF), con ordinal 00001010, que aparece a menudo como ‘\n’, o el tabulador horizontal (HT, TAB), de
ordinal 00001001 y que se representa como ‘\t’, el retorno de carro (carriage return, CR), con ordinal
00001101, etc. Otros caracteres de control son el salto de página (FF), el tabulador vertical (VT), el
timbre (BEL), el carácter para activar mayúsculas (SI) y el carácter para desactivarlas (SO), el carácter
de borrado (DEL), el carácter de escape (ESC) y los separadores de fichero (FS), grupo (GS), registro
(RS) y unidad (US), así como otros caracteres utilizados para sincronizar comunicaciones (SOH, STH,
EOT, ENQ, etc).
51
Representación de caracteres alfanuméricos
Representación de cadenas de caracteres
“1058”
Caracteres ‘1’ ‘0’ ‘5’ ‘8’ ‘\0’
Hexadecimal 3116 3016 3516 3816 0016
Binario 00110001 00110000 00110101 00111000 00000000
A menudo los caracteres no aparecen solos, sino que forman parte de tiras o cadenas de caracteres
(strings). Un string está compuesto por una secuencia de caracteres almacenados en memoria en
orden uno detrás de otro. Los strings tienen longitud variable. Para saber dónde termina un string hay
dos posibilidades:
• Usar un dato entero adicional para indicar cuál es la longitud del string. Así, sabremos dónde
termina el string sin más que sumar dicha longitud a la dirección donde se encuentra su
primer carácter.
• Colocar un carácter delimitador al final del string. En lenguaje C, todos los strings constantes
y variables almacenados en memoria terminan por el carácter nulo ‘\0’ (cuyo ordinal es
precisamente el 0). En tal caso, la longitud de un string no es conocida, y para calcularla
será preciso contar todos los caracteres que tiene antes de llegar al nulo.
52
Representación de caracteres alfanuméricos
Ficheros de texto (I)
Los ficheros de texto contienen datos codificados según un sistema de representación para
información alfanumérica, incluyendo caracteres especiales no imprimibles de tabulación, salto de
línea, retorno de carro, etc.
Cuando se presenta en pantalla el contenido de un fichero de texto, los datos son interpretados
mediante la tabla de códigos que le corresponde (ASCII extendido, UTF-8 u otro diferente), y se
muestran como caracteres alfanuméricos.
53
Representación de caracteres alfanuméricos
Ficheros de texto (II)
La diapositiva presenta una captura de pantalla del editor hexadecimal de ficheros HxD. En la parte
derecha puede verse el contenido del fichero de texto en formato alfanumérico, y la parte central de
la imagen muestra los caracteres codificados en hexadecimal: dos dígitos hexadecimales forman un
byte (8 bits), y representan la codificación binaria de cada carácter según el código ANSI.
54
Índice
1. Introducción.
2. Sistemas de representación numérica.
3. Aritmética binaria.
4. Sistemas de representación en coma fija.
5. Sistemas de representación en coma flotante.
6. Representación de caracteres alfanuméricos.
7. Representación de datos numéricos: texto frente a binario.
55
Datos numéricos: texto frente a binario
Representación de datos numéricos en modo texto
56
Datos numéricos: texto frente a binario
Representación de datos numéricos en binario
Dato Representación
ISO 8859-1: 31 32 39 30 38 (hex.)
00110001 00110010 00111001 00110000 00111000
12908
Complemento a 2: 0000326C (hex.)
00000000000000000011001001101100
Dato Representación
ISO 8859-1: 2D 32 34 37 36 31 (hex.)
00101101 00110010 00110100 00110111 00110110 00110001
-24761
Complemento a 2: FFFF9F47 (hex.)
11111111111111111001111101000111
Dato Representación
ISO 8859-1: 39 2E 33 35 65 2B 32 (hex.)
00111001 00101110 00110011 00110101 01100101 00101011 00110010
9.35e+2
IEEE 754 de precisión simple: 4469C000 (hex.)
01000100011010011100000000000000
Esta diapositiva muestra las representaciones alfanumérica y binaria de los datos utilizados en los
ejemplos anteriores.
Al representar un dato numérico mediante un código alfanumérico, el número de bytes que ocupa
depende de los caracteres utilizados para representarlo (dígitos, signos, coma fraccionaria, indicador
de exponente). La representación alfanumérica de datos numéricos es adecuada para que los
humanos podamos leerlos. Sin embargo, no sirve para realizar cálculos, dado que los circuitos de
cómputo de operaciones aritméticas no están diseñados para soportar este formato.
Los datos numéricos representados en binario puro, complemento a 2 y coma flotante tienen tamaño
fijo, independientemente del valor que estén representando. Por tanto, estas representaciones
requieren menos espacio de memoria para los datos. Además, están soportadas por los circuitos
aritméticos del computador, permitiendo altas velocidades de cómputo. Entonces, cuando el
computador almacena un dato numérico en memoria o lo copia en un registro, utiliza siempre un
sistema numérico binario de representación.
Al introducir un dato numérico en el computador, las rutinas de entrada desde teclado o desde fichero
de texto lo reciben en formato alfanumérico, como una tira de caracteres. Estas rutinas realizan la
conversión de la representación alfanumérica a la representación binaria antes de almacenarlo como
un dato numérico en memoria. La conversión en sentido inverso (de binario a alfanumérico) sólo se
efectuará cuando haya que presentar datos por pantalla o haya que grabarlos en un fichero de texto.
Entre medias, todos los cálculos efectuados con el dato se realizan utilizando su representación en
binario puro, complemento a 2 ó IEEE 754 de precisión simple o doble, según proceda.
Al leer datos numéricos desde un fichero binario, no es preciso realizar conversión alguna antes de
grabarlos en memoria, pues la representación de los datos binarios en fichero y memoria es idéntica.
Igual sucede en las escrituras en ficheros binarios: los datos se graban directamente en el fichero
utilizando su representación en binario puro, complemento a 2 o coma flotante, sin realizar ninguna
traducción y ocupando cada dato un espacio fijo de almacenamiento.
58