Representación de la información numérica

Anuncio
Representación
de la información
numérica
Antonio José Velasco González
Ramon Costa Castelló
PID_00153515
© FUOC • PID_00153515
Representación de la información numérica
Índice
Introducción ............................................................................................
5
Objetivos ...................................................................................................
6
1. Los números y los sistemas de representación ..........................
7
1.1. Sistemas de representación .............................................................
7
1.2. Sistemas de numeración posicionales ...........................................
8
1.3. Cambios de base ............................................................................. 11
1.3.1. Método basado en el TFN ................................................... 11
1.3.2. Método basado en el teorema de la división entera ........... 12
1.3.3. Cambio de base entre b y bn ................................................ 15
1.4. Números con signo ......................................................................... 18
1.5. Suma y resta en los sistemas posicionales ...................................... 19
1.6. Multiplicación y división por potencias de la base
de numeración ................................................................................ 20
1.7. Representación en notación científica ........................................... 22
1.8. Suma y resta en notación científica ............................................... 23
2. Representación de los números en un computador.................. 25
2.1. Condicionantes físicos ................................................................... 25
2.1.1. Rango de representación ..................................................... 27
2.1.2. Precisión .............................................................................. 28
2.1.3. Error de representación ....................................................... 29
2.1.4. Aproximaciones: truncamiento y redondeo ....................... 29
2.1.5. Desbordamiento .................................................................. 32
2.2. Números naturales .......................................................................... 34
2.3. Números enteros ............................................................................. 35
2.3.1. Representación de enteros en signo y magnitud
en base 2 .............................................................................. 36
2.3.2. Suma y resta en signo y magnitud ...................................... 38
2.3.3. Complemento a la base ....................................................... 39
2.3.4. Representación en complemento a 2 .................................. 40
2.3.5. Cambio de signo en complemento a 2 ............................... 43
2.3.6. Magnitud de los números en complemento a 2 ................. 44
2.3.7. Suma en complemento a 2 ................................................. 46
2.3.8. Resta en complemento a 2 .................................................. 48
2.3.9. Multiplicación por 2k de números en complemento a 2 .... 49
2.3.10. Representación en exceso a M ........................................... 50
2.4. Números fraccionarios .................................................................... 57
2.5. Representación en coma flotante ................................................... 67
2.5.1. Rango de representación en coma flotante ........................ 72
2.5.2. Precisión de una representación en coma flotante ............. 75
2.5.3. Suma en coma flotante ....................................................... 80
© FUOC • PID_00153515
3. Otros tipos de representaciones .................................................... 84
3.1. Empaquetamiento de la información ............................................ 84
3.2. Representación de la información alfanumérica ........................... 86
3.3. Representación BCD ....................................................................... 88
Resumen .................................................................................................... 91
Ejercicios de autoevaluación ............................................................... 93
Solucionario ............................................................................................. 94
Glosario ..................................................................................................... 130
Bibliografía .............................................................................................. 132
Representación de la información numérica
© FUOC • PID_00153515
5
Introducción
Desde que se inventaron, una de las funciones principales de los computadores ha sido la realización de cálculos, tanto dentro del ámbito científico y técnico como administrativo. Los elementos fundamentales de estos cálculos son
los números y las operaciones entre los mismos. No es extraño, por tanto, que
se haya realizado un esfuerzo importante de análisis y estudio de las maneras
de representar y trabajar con los números dentro de un computador.
La adaptación de los sistemas de representación numérica al entorno de los
computadores ha hecho que, finalmente, la manera en la que los humanos trabajamos con los números sea muy distinta, en muchos aspectos, de la manera
en la que trabajan los computadores. Un ejemplo simple puede ilustrar la naturaleza de estas diferencias: en nuestra vida cotidiana utilizamos diez símbolos
distintos para representar los números (0, 1, 2, 3, 5, 7, 6, 8 y 9), mientras que las
características de la tecnología hacen que dentro de los computadores sólo haya
dos símbolos distintos (0 y 1). Por otro lado, la naturaleza de las operaciones que
hacemos y el tipo de números involucrados en los cálculos determinan el sistema de representación numérica más adecuado en cada caso.
Hablamos de los números, muchas veces, de manera genérica, pero es importante recordar que los hay de distintos tipos: los naturales (1, 2, 3, 4, 5, 6, etc.),
los enteros (−3, −10, 0, 10, etc.) y los números fraccionarios (1,025, −23,456),
entre otros. Cada uno de este tipo de números presenta unas características y
propiedades diferenciadas que hay que tener en cuenta en el momento de elegir la manera de representarlos dentro de un computador.
En este módulo, se estudian los principales sistemas de representación de números dentro de los computadores. Se hace un énfasis especial en las características
de cada una de las representaciones y se analiza la problemática introducida por
las limitaciones físicas de los computadores.
Representación de la información numérica
© FUOC • PID_00153515
6
Objetivos
Los objetivos principales que alcanzaréis con el estudio de este módulo son los
siguientes:
1. Conocer los sistemas de representación de la información numérica que
permiten trabajar con números naturales, con números enteros y con números fraccionarios.
2. Conocer en profundidad los sistemas ponderados no redundantes de base
fija 2, 10 y 16, además de saber representar un mismo valor numérico en
bases distintas.
3. Comprender y saber utilizar los formatos con los cuales se codifica la información numérica en un computador: el sistema ponderado en binario para
los números naturales; signo y magnitud, complemento a 2 y exceso a M
para los números enteros; y los sistemas de coma fija y de coma flotante
para la representación de números fraccionarios.
4. Conocer las operaciones aritméticas básicas que lleva a cabo un computador y saber efectuarlas a mano. Estas operaciones son la suma y la resta sobre números naturales, enteros y fraccionarios.
5. Comprender los conceptos de rango y precisión de un formato de codificación de la información numérica en un computador. Esto incluye los conceptos de desbordamiento y de error de representación.
6. Conocer la manera de representar caracteres en formato ASCII.
7. Entender la manera de empaquetar datos a partir de la base 16 o el sistema
BCD.
Representación de la información numérica
© FUOC • PID_00153515
7
Representación de la información numérica
1. Los números y los sistemas de representación
El objetivo de este apartado es dar una visión de conjunto de la representación
de valores numéricos. Se exponen las bases de nuestro sistema de numeración y
se enumeran distintos sistemas de representación de valores numéricos. Después
de esta introducción, pasamos a analizar en profundidad el sistema de representación posicional de base (o raíz) fija. Finalmente, se introducen las técnicas que
nos permiten obtener las diferentes representaciones que un mismo valor numérico tiene según los parámetros que definen el sistema de numeración.
1.1. Sistemas de representación
La idea de valor numérico es un concepto abstracto. El sentido de un valor numérico viene dado por la relación que mantiene con otros valores numéricos.
Utilizamos esta información para relacionarla de distintas maneras con otros
valores numéricos y llegar a determinadas conclusiones.
Para trabajar ágilmente con este tipo de información, debemos poder representarla eficientemente, de manera que tenemos que disponer de lo que denominamos un sistema de representación numérica.
Un sistema de representación numérica es una metodología que permite representar un conjunto de valores numéricos.
La gama de sistemas de representación numérica es bastante amplia. Entre
otros, podemos encontrar los sistemas de raíz o base, los sistemas de dígitos
signados, los sistemas de restos y los sistemas racionales.
Del conjunto de sistemas de representación numérica, los sistemas basados en
raíz (o base) son los que más se utilizan, y en éstos centraremos nuestra atención.
a
Un sistema de representación numérica basado en raíz describe los
valores numéricos en función de una o distintas raíces. La raíz o base
del sistema de numeración indica el número de dígitos distintos de los
que se dispone.
Cuando trabajamos con base 10, disponemos de diez dígitos distintos para la representación: 0, 1, 2, 3, 4, 5, 6, 7, 8 y 9. Si la base del sistema de numeración es
Aspectos de terminología
Se puede utilizar la designación de base o raíz de manera
indistinta, aunque es más habitual el uso de la palabra base:
hablamos de sistemas de numeración en base n.
© FUOC • PID_00153515
8
Representación de la información numérica
2, se dispone de dos dígitos, frecuentemente representados por 0 y 1. En caso de
que la base de numeración sea 16, disponemos de dieciséis dígitos distintos, que
normalmente se representan con: 0, 1, 2, 3, 4, 5, 6, 7, 8, 9, A, B, C, D, E y F.
Por otro lado, hay sistemas de numeración que utilizan más de una base. Se
trata de sistemas de representación de base mixta o combinada.
Los sistemas de representación que usan sólo una base reciben el nombre de
sistemas de base fija. La aritmética que utilizamos de manera cotidiana se desarrolla en un sistema de numeración de base fija en el que la base de numeración es 10.
Consideremos el valor numérico 321 en nuestro sistema de numeración en
base 10. Para representar este valor hemos utilizado el dígito 3, el dígito 2 y el dígito 1, ordenados de una manera determinada. Estos mismos dígitos, ordenados
de otra manera (por ejemplo, 213), representan un valor numérico distinto, pese
a estar constituido por los mismos dígitos. Los sistemas de numeración en los cuales el orden de los dígitos es determinante en la representación numérica se denominan sistemas posicionales.
Un sistema posicional es aquél en el que la representación de un valor
numérico es determinada por una secuencia ordenada de dígitos.
A partir de este punto, los análisis y los estudios contenidos en el resto de los
apartados de este módulo harán referencia a sistemas de numeración posicionales de base fija, que son los que tienen más interés para nuestro estudio de
la representación de la información numérica en los computadores.
a
1.2. Sistemas de numeración posicionales
Estamos acostumbrados a trabajar con sistemas de numeración posicionales.
Nuestra aritmética se basa en un sistema de numeración posicional de base fija, en el que la base de numeración es 10. En este sistema, la posición que ocupa un dígito tiene asociada un peso determinado. Esto quiere decir que la
representación de los números naturales empieza por 0 y los dígitos siguen
hasta llegar al 9. Después del dígito 9 viene una combinación de dos dígitos,
el 10, porque sólo disponemos de diez dígitos distintos. La secuencia de números naturales es de la forma: 0, 1, 2, 3, 4 ,5, 6, 7, 8 ,9, 10, 11, 12, 13, 14, 15,
16, 17, 18, 19 ,20, etc.
Consideremos el valor 632(10. Entendemos que este número representa 6 centenas, 3 decenas y 2 unidades. Un cambio de orden de los dígitos (por ejemplo,
326(10) comporta un cambio de los pesos asociados y, por lo tanto, un cambio
del valor numérico representado.
Sistema de representación
de base mixta
Un ejemplo de este tipo de sistema es el sistema horario, en el
cual los valores varían en función de las bases 24, 60 y 60
(horas, minutos y segundos).
9
© FUOC • PID_00153515
Representación de la información numérica
Un sistema de representación numérica posicional de base fija es
aquél en el que un valor numérico X se representa como una secuencia
ordenada de dígitos, de la manera siguiente:
X = xn−1xn−2 · · · x1x0,x−1 · · · x−m
donde cada xi es un dígito tal que 0 ≤ xi ≤ b − 1, donde b es la base del sistema de numeración y xi el dígito de la posición i-ésima de la secuencia.
Las posiciones con subíndice negativo corresponden a la parte fraccionaria
del valor numérico y se consignan a la derecha de la coma. Las posiciones con
subíndice positivo corresponden a la parte entera del valor numérico y se
consignan a la izquierda de la coma.
Para indicar la base b del sistema de numeración seguiremos la nomenclatura
X(b, donde X es la representación del valor numérico (secuencia ordenada de
a
dígitos) en base b.
Consideremos de nuevo el valor 632(10. Podemos expresar este número en
función de los pesos asociados a la posición que ocupa cada dígito de la manera siguiente:
632(10 = 6 · 100 + 3 · 10 + 2 · 1
Según la numeración que hemos establecido, en el número 632(10, el dígito 2
ocupa la posición 0, el dígito 3 ocupa la posición 1 y el dígito 6 ocupa la posición 2. Podemos reescribir la expresión anterior relacionando los pesos con la
base de numeración y la posición que ocupa cada dígito:
632(10 = 6 · 102 + 3 · 101 + 2 · 100
Podemos intuir que, en general, un sistema de representación numérica posicional de base fija permite expresar un valor numérico de esta manera, según
la base de numeración y la posición de cada dígito.
Examinemos, ahora, el número 34,75(10. Se trata de un número con parte fraccionaria. Según la numeración de dígitos propuesta, el dígito 7 ocupa la posición −1 y el dígito 5 la posición −2, mientras que los dígitos 3 y 4 (dígitos de la
parte entera) ocupan las posiciones 1 y 0, respectivamente. La expresión de este
valor en función de la base de numeración y de la posición de cada dígito es:
34,75(10 = 3 · 101 + 4 · 100 + 7 · 10−1 + 5 · 10−2
Recordemos que x − k =
La secuencia de dígito que representa un valor numérico en un sistema posicional debe ser ordenada, porque cada posición tiene un peso asociado. En un
sistema de base fija, el valor de este peso depende de la posición que ocupa el
1
xk
10
© FUOC • PID_00153515
Representación de la información numérica
dígito y de la base de numeración. El peso asociado a la posición p es bp, donde
b es la base de numeración.
a
De esta manera:
X=
n −1
∑x
i =− m
i
bi = xn −1 · b n −1 + xn − 2 · b n − 2 + ... + x− m · b − m
Esta expresión se conoce como el teorema fundamental de la numeración (TFN), y nos muestra cómo se expresa un número según la base
Abreviaremos teorema fundamental
de la numeración con la sigla TFN.
en la que está representado.
Por lo tanto, además de una secuencia de dígitos correspondiente a la representación de un valor numérico en un sistema posicional de raíz fija, habrá que cono-
a
cer la base de numeración para determinar el valor numérico representado.
Consideremos la secuencia de dígitos 235. Ésta es una secuencia de dígitos que
representa un valor numérico válido en cualquier sistema de numeración posicional de raíz fija en el que la base sea mayor o igual que 6, dado que el 5 no
es un dígito válido en las bases de numeración inferiores a 6. Ahora bien, esta
secuencia de dígitos representa valores numéricos distintos según la base de
numeración. Por lo tanto, 235(6 ≠ 235(10 ≠ 235(16.
La tabla siguiente muestra la correspondencia entre las representaciones de los
valores en las bases más habituales:
Base 2
Base 4
Base 8
Base 10
Base 16
0
0
0
0
0
1
1
1
1
1
10
2
2
2
2
11
3
3
3
3
100
10
4
4
4
101
11
5
5
5
110
12
6
6
6
111
13
7
7
7
1000
20
10
8
8
1001
21
11
9
9
1010
22
12
10
A
1011
23
13
11
B
1100
30
14
12
C
1101
31
15
13
D
1110
32
16
14
E
1111
33
17
15
F
10000
100
20
16
10
10001
101
21
17
11
10010
110
22
18
12
Elementos de la tabla
En cada columna se representan los valores numéricos desde el 0 hasta el 18(10 en la base
indicada en la casilla superior
de la columna. En cada fila disponemos de la representación
del mismo valor numérico en
diferentes bases. La correspondencia entre estas representaciones se explica en el
siguiente subapartado.
11
© FUOC • PID_00153515
El sistema de numeración con el que trabajaremos habitualmente tiene base
10 y recibe el nombre de sistema decimal. Análogamente, se denomina siste-
Representación de la información numérica
Un dígito binario recibe el nombre
de bit, que es un acrónimo de la
expresión inglesa binary digit.
ma binario al sistema de numeración en base 2, sistema octal al que utiliza
a
base 8 y sistema hexadecimal al que utiliza base 16.
1.3. Cambios de base
La secuencia ordenada de dígitos que representa un valor numérico cambia según la base b del sistema de numeración, pero hay una relación directa entre estas representaciones.
Los métodos de cambio de base nos permiten encontrar la secuencia
de dígitos de un valor numérico X que corresponde al sistema de numeración en base b’, a partir de la representación del valor numérico X en
el sistema de numeración en base b, es decir:
X(b → Método de cambio de base → X(b’
En los apartados siguientes, se exponen las dos maneras básicas de efectuar un
cambio de base.
1.3.1. Método basado en el TFN
Consideremos el número 324(10. Hemos visto que el TFN nos permite expresar
un valor numérico según su base. Si aplicamos el TFN a este número, tenemos:
324(10 = 3 · 102 + 2 · 101 + 4 · 100
Si hacemos las operaciones indicadas a la derecha de la igualdad en base 10,
obtenemos la representación en base 10 de este valor numérico, que es el que
tenemos a la izquierda de la igualdad.
Ahora bien, si hiciésemos las operaciones en otra base, por ejemplo en base 7,
obtendríamos la representación de este valor numérico en base 7. Si hiciésemos las operaciones en base b, obtendríamos la representación en base b.
La dificultad reside en operar en una base distinta de la base 10, puesto que no
estamos acostumbrados a esto. Por lo tanto, este método nos será útil para pa-
a
sar un valor representado en una base b a base 10.
Cambio de base basado en el TFN
Para realizar el cambio de base siguiente: 462(7 → X(10
1) Ponemos el número en función de su base (base 7):
462(7 = 4 · 72 + 6 · 71 + 2 · 70
Utilidad de los cambios
de base
Los cambios de base serán
de utilidad, por ejemplo, para
convertir valores numéricos
expresados en base 10 (nuestro sistema habitual de numeración) a base 2 (sistema de
numeración habitual en los
computadores), y viceversa.
12
© FUOC • PID_00153515
Representación de la información numérica
Hacemos las operaciones a partir de la aritmética de la base de llegada (base 10):
4 · 72 + 6 · 71 + 2 · 70 = 4 · 49 + 6 · 7 + 2 · 1 = 240(10
Las secuencias de dígitos 462(7 y 240(10 representan el mismo valor numérico. Son dos
representaciones del mismo número, expresado en sistemas de numeración que tienen
bases distintas: base 7 la primera y base 10 la segunda.
Podemos formalizar el proceso para transformar la representación de un
valor numérico X en base b a base 10 de la siguiente manera:
1) Expresar el valor numérico X según la base b del sistema de numeración en el que está representado (siguiendo el TFN).
2) Hacer las operaciones aritméticas en base 10. Para los casos en los
que b > 10, será necesario convertir los dígitos de base b a base 10 antes
de hacer las operaciones.
El método es válido tanto para números enteros como para números con parte
fraccionaria.
a
Cambios de base basados en el TFN
Para realizar el cambio de base siguiente: 101100,01(2 → X(10
1) Ponemos el número en función de su base (base 2):
101100,01(2 = 1 · 25 + 0 · 24 + 1 · 23 + 1 · 22 + 0 · 21 + 0 · 20 + 0 · 2−1 + 1 · 2−2
2) Hacemos las operaciones a partir de la aritmética de base 10:
1 · 25 + 0 · 24 + 1 · 23 + 1 · 22 + 0 · 21 + 0 · 20 + 0 · 2-1 + 1 · 2-2 =
= 1 · 32 + 0 · 16 + 1 · 8 + 1 · 4 + 0 · 2 + 0 · 1 + 0 · 0,5 + 1 · 0,25 = 44,25(10
Para realizar el cambio de base siguiente: AF2C,2(16 → X(10
1) Ponemos el número en función de su base (base 16):
AF2C,2(16 = A · 163 + F · 162 + 2 · 161 + C · 160 + 2 · 16−1
2) Hacemos las operaciones a partir de la aritmética de base 10. En este caso, encontramos que la base inicial es mayor que 10. Por lo tanto, deberemos transformar los dígitos
antes de hacer las operaciones:
A · 163 + F · 162 + 2 · 161 + C · 160 + 2 · 16−1 =
= 10 · 163 + 15 · 162 + 2 · 161 + 12 · 160 + 2 · 16−1 = 44844,125(10
1.3.2. Método basado en el teorema de la división entera
La dificultad que se presenta con el método de cambio de base basado en el
TFN para conseguir la representación de un número en una base b que no sea
base 10 es que hay que hacer operaciones en esta base b. Con el objetivo de
superar esta dificultad, disponemos de un método alternativo para hacer un
cambio de base.
Valores
decimales
Dígitos
hexadecimales
0
0
1
1
2
2
3
3
4
4
5
5
6
6
7
7
8
8
9
9
10
A
11
B
12
C
13
D
14
E
15
F
13
© FUOC • PID_00153515
Representación de la información numérica
La idea subyacente de este segundo método es ir haciendo de manera iterativa
divisiones enteras de la representación en base 10 por el valor de la nueva base
de numeración. Los restos de las divisiones enteras forman los dígitos de la representación en la nueva base:
317(10 → X(7
317 = 45 · 7 + 2
45 =
6·7+3
6 =
0·7+6
317(10 = 632(7
La secuencia de restos tomados en orden inverso nos da la representación en
base 7. Las secuencias de dígitos 632(7 y 317(10 representan el mismo valor numérico. Son dos representaciones del mismo número, expresado en sistemas de
numeración que tienen bases distintas: base 7 la primera y base 10 la segunda.
Para el cambio de base de números fraccionarios, debemos separar y tratar de
manera independiente la parte entera y la parte fraccionaria.
a
1) Parte entera: aplicar sucesivamente el mecanismo de la división entera, dividiendo la parte entera por el valor de la nueva base, y haciendo las operaciones
en base 10. La secuencia de restos obtenidos, tomados del último al primero conseguido, corresponde a la secuencia de dígitos de izquierda a derecha de la parte
entera en la nueva base. Para los casos en los que la nueva base sea mayor que 10,
será necesario convertir los restos obtenidos a dígitos de la nueva base.
2) Parte fraccionaria: sucesivamente, se separa la parte fraccionaria y se multiplica por el valor de la nueva base. Las operaciones se hacen en base 10. La secuencia de valores enteros obtenidos al hacer las multiplicaciones tomados del
primero al último obtenido corresponde a la secuencia de dígitos de izquierda a
derecha en la nueva base de representación. Para los casos en los que la nueva
base sea mayor que 10, habrá que convertir los valores enteros obtenidos a dígitos de la nueva base.
Finalmente, hay que juntar la parte entera y la parte fraccionaria obtenidas.
Cambio de base
Consideremos el siguiente cambio de base:
44,25(10 → X(2
a) Parte entera: aplicamos sucesivamente el mecanismo de la división entera, dividiendo la parte entera por el valor de la nueva base (base 2):
44
22
11
5
2
1
= 22 · 2 + 0
= 11 · 2 + 0
= 5·2+1
= 2·2+1
= 1·2+0
= 0·2+1
44(10 = 101100(2
14
© FUOC • PID_00153515
Representación de la información numérica
b) Parte fraccionaria: multiplicamos sucesivamente la parte fraccionaria por el valor de
la nueva base (base 2):
0,25 · 2 = 0,50 = 0,50 + 0
0,50 · 2 = 1,00 = 0,00 + 1
0,25(10 = 0,01(2
Para completar el cambio de base, hay que juntar la parte entera y la parte fraccionara
que resultan:
44,25(10 = 101100(2 + 0,01(2 = 101100,01(2
Las operaciones se hacen en la base inicial (base 10 en los ejemplos anteriores).
Por lo tanto, es un método especialmente útil para pasar de base 10 a otra base.
Al hacer el cambio de base de la parte entera, detendremos la sucesión de divisiones cuando obtengamos un cociente 0. Al hacer el cambio de base de parte
fraccionaria, detendremos la sucesión de multiplicaciones cuando la precisión
sea suficiente o cuando encontremos un comportamiento periódico. De hecho,
un número que tiene una parte fraccionaria con una representación finita no
periódica en una base puede tener una representación infinita periódica de la
a
parte fraccionaria en otra base. Por ejemplo, 0,3(10 = 0,010011001(2 .
Cambio de base basado en el teorema de la división entera
Consideramos el cambio de base siguiente: 44844,12(10 → X(16
1) Parte entera. Hacemos la sucesión de divisiones enteras:
= 2802 · 16 + 12
= 175 · 16 + 2
=
10 · 16 + 15
=
0 · 16 + 10
44844
2802
175
10
En este caso, la nueva base es mayor que 10. Deberemos transformar los restos en dígitos
de la nueva base (base 16):
12(10 → C(16
2(10 → 2(16
15(10 → F(16
10(10 → A(16
44844(10 = AF2C(16
2) Parte fraccionaria. Multiplicamos sucesivamente por la nueva base:
0,12
0,92
0,72
0,52
0,32
0,12
0,92
…
·
·
·
·
·
·
·
16
16
16
16
16
16
16
=
=
=
=
=
=
=
1,92
14,72
11,52
8,32
5,12
1,92
14,72
=
=
=
=
=
=
=
0,92
0,72
0,52
0,32
0,12
0,92
0,72
+ 1
+ 14
+ 11
+ 8
+ 5
+ 1
+ 14
Observemos que la secuencia que obtenemos se repite (1, 14, 11, 8, 5, 1, 14, …). Esto
quiere decir que se trata de un número periódico. Como en el apartado anterior, deberemos transformar los valores obtenidos en dígitos de base 16:
1(10 → 1(16
14(10 → E(16
11(10 → B(16
8(10 → 8(16
5(10 → 5(16
1(10 → 1(16
0,12(10 = 0,1EB851EB851EB...(16 = 0,1EB85 (16
15
© FUOC • PID_00153515
Representación de la información numérica
Finalmente, juntaremos la parte entera y la parte fraccionaria:
44844,12(10 = AF2C,1EB85 (16
Cuando debemos transformar la expresión de un valor numérico de una base b
a una base b', donde ni b ni b' son la base 10, utilizaremos la base 10 como base
intermedia. Así pues, utilizaremos el primer método (basado en el TFN) para pasar de la base b a la base 10 y posteriormente el segundo método (basado en el
a
teorema de la división entera) para pasar de la base 10 a la base b'.
Es decir, hacemos los cambios de base:
1
2
X( b ⎯⎯
→ X(10 ⎯⎯
→ X( b ' cuando b ≠ 10 y b' ≠ 10
Potencias de 2
1) Se aplica el método basado en el teorema fundamental de la nume216
65.536
215
32.768
214
16.384
Ejemplo de cambio entre bases distintas de la base 10
213
8.192
Consideramos el cambio de base siguiente: 2232,1(4 → X(6
212
4.096
Haremos este cambio de base en dos pasos:
211
2.048
1) Hacemos el cambio de base 232,1(4 → X(10
210
1.024
29
512
28
256
27
128
26
64
25
32
24
16
23
8
22
4
21
2
20
1
2–1
0,5
2–2
0,25
La simplificación de este tipo de cambio de base es determinada por el he-
2–3
0,125
cho de que un dígito en base bn se corresponde con n dígitos en base b.
2–4
0,0625
2–5
0,03125
2–6
0,015625
2–7
0,0078125
2–8
0,00390625
ración.
2) Se aplica el método basado en el teorema de la división entera.
232,1(2 = 2 · 42 + 3 · 41 + 2 · 40 + 1 · 4−1 =
= 32 + 12 + 2 + 0,25 = 46,25(10
2) Completamos el cambio entre las bases 4 y 6 y transformamos, de esta manera, la representación obtenida en la base 10 a la base 6:
46 = 7 · 6 + 4
7=1·6+1
1=0·6+1
↓
46(10 = 114(6
0,25 · 6 = 1,50 = 0,50 + 1
0,50 · 6 = 3,00 = 0,00 + 3
↓
0,25(10 = 0,13(6
Finalmente, uniremos la parte entera y la parte fraccionaria: 46,25(10 = 114,13(6
1.3.3. Cambio de base entre b y bn
Hay un tipo especial de cambio entre bases que se da cuando una base es potencia de la otra. Esta particularidad simplifica mucho la conversión.
Paso de b a bn
Consideramos la conversión siguiente:
10010110,01101101(2 → X(16
16
© FUOC • PID_00153515
Representación de la información numérica
Vemos que una base se puede escribir en forma de potencia del valor de la otra
base: 16 = 24. Este hecho nos dice que cada dígito de base 16 se corresponde
con cuatro dígitos de base 2.
Para cambiar de base, haremos agrupaciones de cuatro dígitos binarios y convertiremos directamente cada agrupación en un dígito hexadecimal. Las agrupaciones se hacen siempre a partir de la coma, y deben ser completas.
1001
0110
,
0110
1101
(2
9
6
,
6
D
(16
10010110,01101101(2 = 96,6D(16
Si faltan dígitos para completar una agrupación, añadiremos ceros.
a
En el ejemplo siguiente, debemos completar las agrupaciones con ceros:
101110,101101(2 → X(16
Podemos escribir una base en función de la otra de la forma 16 = 24. El exponente es 4 y, por lo tanto, haremos agrupaciones de cuatro dígitos binarios a partir
de la coma. Añadiremos los ceros necesarios para completar las agrupaciones y
convertiremos directamente cada agrupación en un dígito hexadecimal:
0010
1110
,
1011
0100
(2
2
E
,
B
4
(16
101110,101101(2= 2E,B4(16
Paso de bn a b
El cambio entre bases de este tipo es análogo al caso tratado en el apartado anterior, pero en sentido inverso, es decir, cada dígito en base bn se transformará
en n dígitos en base b.
Podemos ver su proceso con el cambio de base siguiente:
7632,13(8 → X(2
En primer lugar, analizamos la relación entre las bases, que es 8 = 23. Consiguientemente, cada dígito en base 8 dará lugar a tres dígitos binarios:
7
6
3
2
,
1
3
(8
111
110
011
010
,
001
011
(2
7632,13(8= 111110011010,001011(2
Podéis ver los sistemas de numeración
posicionales del subapartado 1.2 de
este módulo.
17
© FUOC • PID_00153515
Representación de la información numérica
Debemos prestar atención al hecho de que se deben obtener exactamente n dígitos en base b por cada dígito en base bn (en este caso, tres dígitos binarios por
cada dígito octal), añadiendo para cada dígito los ceros necesarios. Veamos en
el ejemplo siguiente cómo cada dígito hexadecimal da lugar a cuatro dígitos
binarios, ya que la relación entre las bases 16 = 24:
E1B2,4F(16 → X(2
E
1
B
2
,
4
F
(16
1110
0001
1011
0010
,
0100
1111
(2
E1B2,4F(16 = 1110000110110010,01001111(2
Errores habituales
Con frecuencia, se cometen dos errores cuando se hacen estos dos últimos tipos de cambio de base:
1) Cuando hacemos un cambio de la base bn a la base b, cada dígito de la
base bn debe dar lugar a n dígitos en la base b.
Error frecuente
Hay que evitar el siguiente error:
A3(16 = 101011(2
donde el dígito hexadecimal A ha dado lugar a los dígitos 1010 en base 2 y el dígito 3 a
los dígitos 11. En realidad, debería ser:
A3(16 = 10100011(2
donde se han añadido dos ceros para completar el conjunto de cuatro dígitos que debe
generar el dígito hexadecimal 3.
2) Cuando hacemos un cambio de la base b a la base bn, son necesarios n dígitos de la base b para obtener un dígito en la base bn.
Error frecuente
Hay que evitar el siguiente error:
1100,11(2 = C,3(16
donde los dígitos binarios 1100 dan lugar al dígito hexadecimal C y los dígitos 11 al 3.
En realidad, debería ser:
1100,1100(2 = C,C(16
donde se han incorporado dos ceros por la derecha para constituir un grupo de cuatro
dígitos binarios que dan lugar al dígito hexadecimal C.
Actividades
1. Expresad los siguientes números en términos de su base y convertidlos a base 10:
a) 46(7
b) 3AD(16
18
© FUOC • PID_00153515
Representación de la información numérica
c) 10011101(2
d) 333(4
e) 333(8
f) B2,3(16
g) 2232,02(4
h) 2464,1(8
i) 1110100,01101(2
2. Haced los siguientes cambios de base:
a) 3245(8 → X(10
b) 425(10 → X(2
c) AC3C(16 → X(10
d) 45367(10 → X(16
e) 344(10 → X(2
3. Convertid a hexadecimal los siguientes números:
a) 111010011,1110100111(2 → X(16
b) 0,1101101(2 → X(16
c) 111011,1010010101(2 → X(16
4. Rellenad la tabla siguiente:
Binario
Octal
Hexadecimal
Decimal
1101100,110
362,23
A1,03
74,3
En cada fila, encontrad un valor numérico expresado en la base que indica la casilla superior de la columna donde está. Consignad en el resto de las casillas la representación
correspondiente, según la base indicada en la parte superior.
5. Convertid los siguientes números en base hexadecimal a base 2, base 4 y base 8:
a) ABCD(16
b) 45,45(16
c) 96FF,FF(16
6. Convertid a base 2 los siguientes valores:
a) 4365,14(10
b) 234,2(5
c) 31,125(10
7. Convertid a base 10 los siguientes valores:
a) 10011001,1101(2
b) 110011,11(4
c) 1010,11(8
1.4. Números con signo
Cuando representamos magnitudes, con frecuencia les asignamos un signo (+/−),
que indica si la magnitud numérica es positiva o negativa.
Designaremos los números que llevan la información de signo como números
con signo, en contraposición a los números sin signo, que sólo nos dan infor-
a
mación sobre la magnitud del valor numérico.
La información de signo se incorpora con un símbolo que precede a la secuencia de dígitos que identifica la magnitud. Se utiliza el símbolo − para identifi-
A veces, cuando se trabaja con
números con signo, el signo
positivo (+) no se escribe: sólo
aparece el signo cuando se trata de
un número negativo.
19
© FUOC • PID_00153515
Representación de la información numérica
car las magnitudes negativas y el símbolo + para identificar las magnitudes
positivas:
+23(10
−456(8
−34,5(7
+AF,34(16
1.5. Suma y resta en los sistemas posicionales
Estamos habituados al proceso de suma y de resta de valores numéricos en
base 10. A continuación, analizaremos cuidadosamente un ejemplo en base 10
para entender el proceso de suma en otras bases. Hacemos la suma de los valores numéricos 8341(10 y 2463(10.
1
← transportes
1
+
1
8
3
4
1
(10
2
4
6
3
(10
0
8
0
4
(10
← resultado
Fijémonos en el hecho de que la suma de dos valores numéricos se hace, en los
sistemas posicionales, sumando los dígitos del mismo peso. Ahora bien, la suma
de estos dígitos puede superar el valor de la base de representación (10 en nuestro
ejemplo) y generar, consiguientemente, un transporte (lo que nos “llevamos”).
La suma realiza, por lo tanto, progresando de derecha a izquierda, sumando
en cada etapa los dígitos del mismo peso (los que ocupan la misma posición)
y el transporte de la etapa precedente. La suma de estos tres dígitos da un re-
El bit (dígito binario) de transporte
recibe en inglés el nombre de carry.
Este término es de uso habitual
dentro del entorno de los
computadores.
sultado de dos dígitos: el dígito de la suma, y el dígito de transporte para la
etapa siguiente (que será 0 si la suma de los tres dígitos es inferior al valor b de
la base, 10 en este ejemplo).
El ejemplo siguiente de suma de dos valores hexadecimales sigue las mismas pautas, pero ajustadas al caso de base 16 (donde tenemos dieciséis dígitos distintos):
← transportes
1
+
3
5
8
2
(16
A
F
1
8
(16
E
4
9
A
(16
← resultado
El proceso de suma en base 2 es análogo:
1
+
1
Tabla de suma en base 2
transporte + bit de suma
← transportes
1
1
1
1
1
0
1
1
1
0
1
0
0
(2
1
0
1
0
1
1
0
1
(2
0
0
1
0
0
0
0
1
(2
← resultado
+
0
1
0
0+0
0+1
1
0+1
1+0
20
© FUOC • PID_00153515
Representación de la información numérica
En los anteriores ejemplos precedentes se pone de manifiesto que se puede
producir un transporte en la última etapa de suma. Por lo tanto, el resultado
de una suma de números puede necesitar para su representación un dígito más
que los operandos.
El resultado de la suma de dos números representados en base b donde
el mayor tiene n dígitos puede requerir un máximo de n + 1 dígitos para
su representación.
La resta de dos valores numéricos recibe un tratamiento semejante. La opera-
En inglés, el transporte en el caso
de la resta recibe el nombre
de borrow.
ción también se realiza de derecha a izquierda, operando los dígitos de igual
peso, y considerando el transporte de la etapa precedente. Se obtienen de nuevo dos dígitos: el dígito de resta y el dígito de transporte. La particularidad en
esta operación es que el número de menor magnitud (sustraendo) es el que se
debe restar del número de mayor magnitud (minuendo):
−
1
← minuendo
8
3
4
1
1
1
2
4
6
3
(10
← subtraendo
5
8
7
8
(10
← resultado
(10
← transportes
El procedimiento en otras bases es idéntico. Sólo hay que adecuarse a la nueva
base y procurar restar la magnitud pequeña de la grande:
A
F
1
8
(16
← transportes
1
− 3
5
8
2
(16
7
9
9
6
(16
← resultado
1
0
1
1
1
1
0
1
1
0
1
− 0
1
1
1
0
1
0
0
(2
0
0
1
1
1
0
0
1
(2
(2
← transportes
En el caso de la operación de resta, no se puede producir ningún transporte en
la última etapa. Por este motivo, el resultado de una resta de números necesitará
para su representación, como máximo, los mismos dígitos que el minuendo.
El resultado de la resta de dos números representados en base b donde
el minuendo tiene n dígitos puede requerir un máximo de n dígitos para
su representación.
1.6. Multiplicación y división por potencias de la base
de numeración
En un sistema posicional de base fija, cada dígito tiene un peso bp, donde b es
la base de numeración y p la posición que ocupa el dígito. El TFN nos permite
← resultado
21
© FUOC • PID_00153515
Representación de la información numérica
expresar un número en términos de estos pesos, que son potencias de la base
de numeración.
En el caso de los sistemas de representación decimales, la base de numeración
es 10. Por lo tanto, los pesos asociados a los dígitos son potencias de 10. Con-
Podéis consultar los sistemas de
numeración posicionales del
subapartado 1.2 de este módulo.
siguientemente, multiplicar por 10 se traduce en aumentar en una unidad la
potencia de 10 asociada a cada dígito, y dividir por 10 equivale a disminuir en
una unidad la potencia de 10 asociada a cada dígito.
Por ejemplo, el número 56,34(10 se puede expresar en términos de los pesos
asociados a cada dígito siguiendo el TFN:
56,34(10 = 5 · 101 + 6 · 100 + 3 · 10−1 + 4 · 10−2
Si multiplicamos por 10, obtenemos:
56,34(10 · 10 = (5 · 101 + 6 · 100 + 3 · 10−1 + 4 · 10−2) · 10 =
= 5 · 102 + 6 · 101 + 3 · 100 + 4 · 10-1 = 563,4(10.
El efecto que se obtiene es el desplazamiento de la coma fraccionaria. Multiplicar por 10 un número en base 10 equivale a desplazar la coma fraccionaria
una posición a la derecha, mientras que dividirlo por 10 equivale a desplazar
la coma una posición a la izquierda. El proceso se puede extender a la multiplicación y a la división por una potencia de 10: multiplicar por 10k un número en base 10 equivale a desplazar la coma fraccionaria k posiciones a la
derecha, y dividirlo por 10k equivale a desplazar la coma fraccionaria k posiciones a la izquierda.
Este proceso de multiplicación y división por potencias de la base de numeración que aquí encontramos ejemplificado en base 10 es válido para todos los
sistemas de posicionales de base fija b.
a
Multiplicar por bk un número representado en un sistema posicional
de base fija b equivale a desplazar la coma fraccionaria k posiciones a la
derecha.
Dividir por bk un número representado en un sistema posicional de
base fija b equivale a desplazar la coma fraccionaria k posiciones a la izquierda.
Multiplicación por una potencia de 2 en binario
Para multiplicar un número binario por 2k, desplazaremos la coma fraccionaria k posiciones a la derecha. Para multiplicar el 11010(2 por 24, desplazaremos la coma fraccionaria
cuatro posiciones a la derecha:
11010(2 · 24 = 110100000(2
Números sin parte
fraccionaria
En un número sin parte fraccionaria, desplazar la coma k
posiciones a la derecha equivale a añadir k ceros a la derecha,
puesto que la parte fraccionaria es cero. Por consiguiente,
el resultado requerirá k dígitos
más para la representación
que el número inicial.
22
© FUOC • PID_00153515
Este resultado que obtenemos de manera directa se puede justificar con los siguientes
cálculos:
11010(2 · 24 = (1 · 24 + 1 · 23 + 0 · 22 + 1 · 21 + 0 · 20) · 24 =
= (1 · 28 + 1 · 27 + 0 · 26 + 1 · 25 + 0 · 26) = 110100000(2
Por lo tanto, 11010(2 · 24 = 110100000(2.
División por una potencia de 2 en binario
Para dividir un número binario por 2k, desplazaremos la coma fraccionaria k posiciones
a la izquierda. Para dividir el 11100(2 por 22, desplazaremos la coma fraccionaria 2 posiciones a la izquierda:
11100(2 / 22 = 111(2
Este resultado que obtenemos de manera directa se puede justificar con los siguientes
cálculos:
11100(2 / 22 = (1 · 24 + 1 · 23 + 1 · 22 + 0 · 21 + 0 · 20) / 22 =
= (1 · 22 + 1 · 21 + 1 · 20 + 0 · 2−1 + 0 · 2−2) = 111(2
Por lo tanto, 11100(2 / 22 = 111(2.
Las operaciones de división por una potencia de la base de numeración de un
número sin parte fraccionaria pueden dar como resultado un número con parte fraccionaria: 11100(2 / 24 = 1,11(2. Ahora bien, si estamos en un contexto en
el que se trabaja con números sin parte fraccionaria, podemos dar el resultado
en forma de dos números enteros que reciben el nombre de cociente y resto:
el cociente tiene relación directa con la parte entera del resultado y el resto,
con la parte fraccionaria. En este caso, la operación recibe el nombre de división entera, mientras que, por oposición, la primera recibe el nombre de
división real.
El cociente y el resto de la división entera de 11100(2 por 24 se pueden obtener
a partir del resultado de la división real 11100(2 / 24 = 1,11(2, identificando el
cociente con la parte entera (cociente = 1(2) y el resto, con la parte fraccionaria
(resto = 11(2)
El cociente y el resto de una división entera de un número sin parte
fraccionaria por una potencia de la base de numeración se pueden obtener a partir del resultado de división real, identificando el cociente
con la parte entera y el resto, con la parte fraccionaria.
1.7. Representación en notación científica
Las representaciones de números fraccionarios que aparecen en los apartados
precedentes son del tipo 671,34(10. Aquí encontramos un conjunto de los dígitos que representan la parte entera y un conjunto de dígitos destinados a representar la parte fraccionaria.
Supongamos que debemos trabajar con números grandes, como por ejemplo
la velocidad de transmisión de la luz en el vacío (c = 299.792.500 m/s) y, si-
Representación de la información numérica
23
© FUOC • PID_00153515
Representación de la información numérica
multáneamente, con números muy pequeños, como por ejemplo la masa de
un electrón (me = 0,00000000000000000000000000000091095 kg). Para representar números como éstos, encontramos una dificultad importante: necesitamos un número elevado de dígitos. Como en el segundo caso, muchos de
estos dígitos pueden ser cero y, por lo tanto, la eficiencia de la representación
puede ser bastante reducida.
La notación científica es una estrategia que permite superar esta dificultad, y
representar números muy grandes y números muy pequeños con un conjunto
La notación científica también recibe el nombre de representación en
coma flotante.
de dígitos reducido.
Los siguientes números están en notación científica:
+2,997925(10 · 108
−6,487567(10 · 10−5
Los números en notación científica toman la forma:
Cuando el número en notación
científica es positivo, el símbolo +
ante R se puede obviar.
±R · be
donde + o − indica el signo de la magnitud representada, R es un número fraccionario que recibe el nombre de mantisa, b es la base de numeración y e es un número entero que recibe el nombre de exponente.
La mantisa contiene los dígitos significativos de la magnitud representada, y
está precedida por el signo de esta magnitud. El exponente marca el número
de posiciones a la derecha (exponente positivo) o a la izquierda (exponente
negativo) que debemos desplazar la coma fraccionaria para obtener el valor
numérico representado. Veamos algunos ejemplos:
+245,86(10 = +2,4586(10 · 102
−0,0003451(10 = −3,451(10 · 10
(donde R = 2,4586(10, b es 10 y e es 2)
−4
+0,00000000000000000000000000000091095(10 = +9,1095(10 · 10−31
+299792500(10 = +2,997925(10 · 108
Cuando el exponente es positivo,
no suele aparecer el símbolo +
frente al exponente.
Habitualmente se utiliza este tipo de representación para trabajar con las magnitudes de la física, como por ejemplo la velocidad de transmisión de la luz en
el vacío o la masa de un electrón.
1.8. Suma y resta en notación científica
El proceso de suma y de resta en los sistemas posicionales comporta operar los
dígitos del mismo peso. La virtud de la notación científica es, precisamente, la
capacidad de alterar el peso relativo de los dígitos mediante el exponente.
Podéis ver la suma y la resta en los
sistemas posicionales del subapartado
1.5 de este módulo.
24
© FUOC • PID_00153515
Por ejemplo, la primera posición a la izquierda de la coma del número
+1,34(10 · 101 es 101 (ya que +1,34(10 · 101 = +13,4(10), mientras que la primera posición a la izquierda de la coma del número +45,2(10 · 10−3 es 10−3
(ya que +45,2(10 · 10−3 = +0,00452(10).
Por lo tanto, la dificultad de sumar y restar números en notación científica reside en la necesidad de igualar los exponentes de los números que se deben
operar. Para hacerlo, desplazamos la coma del número con menor magnitud
hasta conseguir que el exponente tenga el mismo valor que en el número de
mayor magnitud. A continuación podremos hacer la operación:
1,34(10 · 101 > 45,2(10 · 10−3
+
45,2(10 · 10−3 = 0, 00452(10 · 101
→
+1,
3
4
0
0
0
(10
· 101
+0,
0
0
4
5
2
(10
· 101
+1,
3
4
4
5
2
(10
· 101
El exponente del resultado de la operación de suma o resta se puede volver a
ajustar si es necesario:
−
+4,
1
3
1
0
5
(10
· 106
+4,
1
3
0
0
3
(10
· 106
+0,
0
0
1
0
2
(10
· 106
+0,00102(10 · 106 = +1,02(10 · 103
Actividades
8. Haced las siguientes operaciones en la base especificada:
a) 111011010(2 +100110100(2 =
b) 2345(8 + 321(8 =
c) A23F(16 + 54A3(16 =
d) 111011010(2 − 100110100(2 =
e) 2345(8 − 321(8 =
f) A23F(16 − 54A3(16 =
9. Haced las siguientes operaciones en la base especificada:
a) 62,48(16 + 35,DF(16 =
b) 111101101,11011(2 + 100110100,111(2 =
c) 62,48(16 − 35,DF(16 =
d) 111101101,11011(2 − 100110100,111(2 =
10. Haced las siguientes multiplicaciones:
a) 128,7(10 · 10(10
b) AFD(16 · 16(10
c) 1101,01(2 · 2(10
11. Encontrad el cociente y el resto de las siguientes divisiones enteras:
a) 52978(10 / 10(10
b) 3456(16 / 16(10
c) 100101001001(2 / 2(10
12. Escribid en notación científica el número +12044,4(10.
13. Identificad la mantisa y el exponente del número −3,143(10 · 1045.
14. Sumad los números +123,34(10 · 103 y +67,89(10 · 105.
15. Restad los números +1223,34(10 · 10−2 y +65,6789(10 · 105
Representación de la información numérica
25
© FUOC • PID_00153515
Representación de la información numérica
2. Representación de los números en un computador
En el primer apartado se hace la distinción entre el valor numérico y su representación o codificación. El valor numérico es único, pero tiene una representación diferente en cada sistema de numeración. Nuestro objetivo
en este segundo apartado es estudiar las representaciones que permitan almacenar y procesar de una manera eficiente los valores numéricos en el interior de un computador.
Terminología
A lo largo del texto, utilizaremos indistintamente representación y codificación
para referirnos a la secuencia
de dígitos asociada a un valor
numérico en un sistema
de representación numérica.
2.1. Condicionantes físicos
Las restricciones de la tecnología con la que se construyen los computadores
hace que el sistema binario, donde sólo se dispone de dos dígitos, sea el sistema de numeración más adecuado. Internamente, el computador asocia los
dos dígitos con dos valores diferentes de tensión eléctrica (voltaje).
Un dígito binario recibe el nombre de bit. Los bits pueden tomar los
valores 0 y 1. Un bit constituye la unidad de información que se define
como la cantidad de información asociada a la respuesta de una pregunta formulada de manera no ambigua, en la que sólo son posibles
dos alternativas de respuesta y que, además, tienen la misma probabilidad de ser elegidas.
Aunque el sistema de numeración habitual en los computadores es el sistema
binario, trabajar directamente en base 2 suele ser poco práctico para nosotros,
dada la gran cantidad de bits necesarios para representar valores numéricos
usuales. Ahora bien, dada la relación directa que hay entre bases b y bn, es habitual convertir los valores numéricos internos del computador a hexadecimal,
ya que es considerablemente más compacta y tiene una relación directa con
a
base 2 (puesto que 16 es potencia de 2, 16 = 24).
Aunque se utilice la base 2 dentro de los computadores, las unidades funcionales del computador no suelen trabajar bit a bit, sino que generalmente procesan cadenas de bits de una longitud determinada.
Por las mismas características del sistema binario, hay unas longitudes determinadas que ofrecen un rendimiento computacional más elevado: son las cadenas cuya longitud es una potencia de 2.
Las cadenas adecuadas son, por lo tanto, las de longitud 2, 4, 8, 16, 32, 64,
etc. Las cadenas de 8 bits reciben el nombre de byte u octeto. Cuando dis-
Bit es un acrónimo de la expresión
inglesa binary digit.
© FUOC • PID_00153515
26
Representación de la información numérica
ponemos de 16 bits, hablamos de cadenas de 2 bytes; de 4 bytes para cadenas
de 32 bits; etc.
Hay una longitud característica relacionada con un computador, que denominamos palabra y que depende de la arquitectura particular de cada computador.
Una palabra es la cantidad de información con la que opera un computador.
A pesar de las mejoras tecnológicas, la capacidad de almacenamiento de los computadores es finita. Esto condiciona, y mucho, la representación numérica dentro
de los computadores, sobre todo cuando se trabaja con números que requieren
un número infinito de dígitos para representar la parte fraccionaria, como por
ejemplo los casos bien conocidos de los números irracionales, como
2.
Evolución de la longitud
típica de la palabra
La longitud típica de la palabra
evoluciona con la tecnología.
Actualmente, la palabra de los
procesadores que equipan los
computadores de carácter general es de 32 bits, pero cada
vez aparecen más procesadores que trabajan con palabras
de 64 bits. Los procesadores
más veteranos y muchos de los
actuales microcontroladores
trabajan con palabras de 4,
8 o 16 bits.
Estas limitaciones físicas que tienen los computadores en la representación de
valores numéricos son semejantes a las que encontramos cuando trabajamos
con lápiz y papel. Por ejemplo, en los cálculos aritméticos manuales trabajamos con una aproximación de los números irracionales. Para el número π, utilizamos el valor 3,14(10 o el 3,1416(10 según el grado de precisión necesario. De
una manera semejante, dentro de los computadores se trabaja con aproximaciones de aquellos números que no se pueden representar de manera exacta.
Cuando un número no se puede representar de manera exacta dentro
de un computador, se comete un error de representación. Este error es
la distancia entre el número que queremos representar y el número representado realmente.
De esta manera, si representamos el número π por el valor 3,14(10, cometemos un error igual a ⏐π − 3,14(10⏐ = 0,00159…, mientras que si trabajamos con
el valor 3,1416(10 para representar el número π, el error es ⏐π − 3,1416(10⏐ =
7,3464102… · 10–6.
Cuando trabajamos con lápiz y papel, escribimos los números de la manera
más práctica y adecuada. Podemos escribir 03, 3,00, 3,000 o simplemente 3.
En cambio, dentro de los computadores hay que seguir unas pautas más rígidas, un formato que especifique y fije el número de dígitos que hay que utilizar o el número de dígitos fraccionarios con los que se trabaja.
Un formato de representación numérica es la manera específica en la
que se deben representar los valores numéricos con los que se trabaja.
Los números que se pueden
representar de manera exacta
reciben el nombre de números
representables.
27
© FUOC • PID_00153515
Representación de la información numérica
Por ejemplo, supongamos que tenemos definido un formato de representación de la forma x1x0, x–1x–2, donde cada dígito xi corresponde a un dígito decimal. En este formato, el número 3 se debe representar como 03,00 y el 10,2,
como 10,20.
Una vez definido el formato de la representación numérica, queda fijado el
conjunto de números que pueden ser representados.
a
En los siguientes subapartados, se describen los parámetros que nos ayudan a
medir la eficiencia de un formato de representación numérica: el rango de representación, la precisión y el error de representación.
2.1.1. Rango de representación
Dado que el conjunto de números que se pueden representar es finito, los tendremos delimitados dentro de un intervalo que recibe el nombre de rango.
De esta manera, fijado el formato x1x0,x–1x–2 en la base 10, sólo podremos representar números entre el 00,00(10 (el menor número representable en este
formato) y el 99,99(10 (el mayor número representable en este formato). El número 935(10, por ejemplo, no se puede representar en este formato, ya que no
Dentro del intervalo
de representación…
… sólo se puede representar
un conjunto de números.
Aunque en el ejemplo el intervalo es [0, 99,99], el número
34,789(10 no se puede representar de manera exacta,
ya que tiene tres dígitos
fraccionarios.
está dentro del intervalo de representación.
El rango de un formato de representación numérica es el menor intervalo que contiene todos los números representables. Los límites
del intervalo vienen determinados por el mayor y el menor número
que se pueden representar.
La notación que se utiliza para especificar un rango de representación es:
[a, b]
donde a es el menor número que podemos representar en el formato espeficado y b, el mayor.
Los números que están fuera del rango de representación de un formato determinado no son representables en aquel formato.
a
La notación que se utiliza para
definir un intervalo de números
representables es [a,b], donde a y b
son los límites del intervalo y
forman parte del mismo.
28
© FUOC • PID_00153515
Representación de la información numérica
Hay una limitación inherente al número de bits disponibles en un formato de
representación: con n dígitos en base b, disponemos de bn códigos o combinaciones de dígitos. Cada una de estas combinaciones puede representar un valor numérico. Por lo tanto, con n dígitos en base b podremos representar un
máximo de bn números distintos.
a
De esta manera, en una representación de 5 bits disponemos de 25 = 32
combinaciones diferentes. Podremos representar un máximo de 32 valores
numéricos. El tipo de codificación que se haya utilizado determinará cuáles
son estos valores.
Cuando trabajamos en base 10, sabemos que con cuatro dígitos disponemos
de 104 códigos diferentes (combinaciones de los cuatro dígitos decimales). Si
usamos estos códigos para representar números naturales, podremos representar desde el 0000 (0(10), hasta el 9999 (104 − 1).
2.1.2. Precisión
Estamos habituados a trabajar de manera dinámica con la precisión, y la ajustamos automáticamente a nuestras necesidades. Si medimos la longitud de
una tabla en metros, trabajamos con dos o, como mucho, con tres dígitos fraccionarios. Decimos “esta tabla mide 1,52 m”, pero difícilmente diremos “esta
tabla mide 1,526246 m”.
De manera intuitiva, podemos decir que un formato de representación que
trabaje con dos dígitos fraccionarios tendrá suficiente precisión para esta aplicación. Un formato de estas características nos permitirá distinguir 1,52 m
de 1,53 m, pero no de 1,5234 m. Decimos que la precisión de este formato es de
0,01 m, que es la distancia entre dos valores consecutivos representables en
este formato.
La precisión de un formato de representación numérica es la distancia
entre dos números representables consecutivos.
En la mayoría
de los formatos…
… de representación la distancia entre dos números
representables consecutivos
cualesquiera es la misma.
Ahora bien, cuando se utiliza
la notación científica la precisión es variable y depende del
valor del exponente.
© FUOC • PID_00153515
29
Representación de la información numérica
2.1.3. Error de representación
Consideramos un formato de representación con cuatro dígitos en base 10, de
los cuales dos son fraccionarios. Los números representables en este formato
son de la forma x1x0,x–1x–2, donde xi es un dígito de la base 10.
En este formato podemos representar el 12,34(10 o el 45,20(10 de una manera exacta. En cambio, el número 15,027(10 no se puede representar de una
manera exacta. Si debemos trabajar con este número en este formato, tendremos que utilizar una aproximación. Podemos aproximar este número
por un número representable cercano como el 15,03(10. Trabajar con una
aproximación del número en lugar de hacerlo con una representación
exacta comporta cometer un error. En este caso, el error que se comete es
|15,03(10 − 15,026(10 | = 0,004(10 .
El error de representación ε es la distancia entre el número X que queremos representar y el número representable X^ con el que lo aproximamos. Es decir, ε = |X − X^ |
El error de representación que se puede cometer en un formato determinado
está relacionado directamente con el número de dígitos fraccionarios disponibles.
a
Volvamos al formato x1x0,x–1x–2 en base 10. El número 23,457(10 no es representable en este formato. Lo podemos aproximar por el 23,45(10 o por el 23,46(10,, que
son los dos números representables más cercanos. Los dos números están a
una distancia del 23,457(10 inferior a 0,01, que es la precisión (distancia entre
dos números representables consecutivos) de este formato.
En general, podemos establecer que la precisión delimita el error de representación máximo que se llegará a cometer en un formato al hacer
la aproximación de un número no representable que está dentro del
rango de representación.
Los números que no están dentro del rango de representación del formato no
son representables ni aproximables.
2.1.4. Aproximaciones: truncamiento y redondeo
Acabamos de establecer que el número 23,45(10 o el número 23,46(10 son buenas aproximaciones del número 23,457(10 al formato x1x0,x−1x−2 en base 10.
Rangos de representación
En el formato x1x0,x–1x–2 en
base 10, el rango de representación es [0, 99,99]. Un número como el 128(10, que está
fuera del rango de representación, no es representable. No
se considera que 99,99(10 sea
una aproximación válida para
este número en este formato.
© FUOC • PID_00153515
30
Representación de la información numérica
Debemos elegir una de las dos posibilidades, por lo cual estableceremos un criterio de elección. Este proceso de elección se denomina aproximación o
cuantificación. Los criterios de elección más habituales son el truncamiento
y el redondeo.
1) Truncamiento
El truncamiento es el criterio de cuantificación más directo y sencillo de aplicar, ya que no comporta ningún tipo de cálculo y consiste en ignorar los dígitos que sobran. En el formato x1x0,x−1x−2 en base 10, este criterio aproxima el
número 23,457(10 por el 23,45(10, fruto de ignorar el último dígito, que no cabe
en el formato disponible.
La cuantificación o aproximación por truncamiento consiste en despreciar los dígitos fraccionarios que no caben en el formato disponible.
El proceso de truncamiento no comporta ningún tipo de cálculo.
Si aplicamos el criterio de truncamiento al formato que tenemos definido, encontramos que el 23,451(10, el 23,456(10 y el 23,459(10 se aproximan al mismo
número representable, el 23,45(10, el número que queda si ignoramos los dígitos fraccionarios que no caben en el formato x1x0,x–1x–2 en base 10.
Ahora bien, el error de representación cometido en cada caso es distinto. El
error es 0,001 para el 23,451(10 (ya que ⏐23,451(10 − 23,45(10⏐ = 0,001), 0,006
para el 23,456(10 y 0,009 para el 23,459(10. En todos los casos, el error de representación es inferior a la precisión, que es 0,01 (distancia entre dos números
representables consecutivos, por ejemplo 23,45(10 y 23,46(10).
En una aproximación por truncamiento, el error máximo de representación es igual a la precisión del formato de representación.
2) Rendondeo
Con el truncamiento, el error de representación del número 23,459(10 en el formato x1x0,x−1x−2 en base 10 es 0,009 (⏐23,459(10 − 23,45(10⏐= 0,009), porque se
La gran ventaja del truncamiento
es que no comporta ningún tipo
de cálculo aritmético.
31
© FUOC • PID_00153515
aproxima por el número 23,45(10. Ahora bien, si aproximásemos el 23,459(10 por
el 23,46(10, el error de representación sería 0,001 (⏐23,46(10 − 23,459(10⏐ = 0,001),
es decir, un error menor. El 23,46(10 es más cercano al número que queremos representar y sería más lógico trabajar con el número representable
más cercano que con el que obtenemos por truncamiento. Esta manera de
proceder recibe el nombre de redondeo o aproximación al más próximo.
Representación de la información numérica
El número que se obtiene
por truncamiento…
… coincide con el que se obtiene por redondeo, siempre que
el número resultante por
truncamiento sea el número
representable más cercano
al número que queremos representar.
La cuantificación o aproximación por redondeo consiste en elegir el
número representable más cercano al número que queremos representar. El proceso de redondeo comporta operaciones aritméticas.
Con el redondeo reducimos el error
máximo a la mitad, pero tiene el
inconveniente de requerir cálculos
aritméticos.
Si aplicamos el criterio de redondeo al formato x1x0,x−1x−2 en base 10, el
23,451(10 se aproxima por el 23,45(10, mientras que el 23,456(10 o el 23,459(10
se aproximan por el 23,46(10, que les es más cercano. El error de representación
es 0,001 para el 23,451(10, 0,004 para el 23,456(10 y 0,001 para el 23,459(10. El
error de representación cometido es inferior a la mitad de la precisión, es decir,
inferior a 0,005 en este caso.
En una aproximación por redondeo, el error máximo de representación es igual a la mitad de la precisión del formato de representación.
Una manera sencilla de aplicar el redondeo al número 23,459(10 al formato
x1x0,x−1x−2 en base 10 es sumarle la mitad de la precisión (es decir, 0,005) y a con-
tinuación hacer el truncamiento del resultado: 23,459(10 + 0,005(10 = 23,464(10,
que truncado en dos dígitos fraccionarios es el 23,46(10, el número representable más cercano al 23,459(10.
Para aproximar un número por redondeo, debemos hacer lo siguiente:
1) Sumar la mitad de la precisión del formato de representación al nú-
mero que se quiere aproximar.
2) Truncar el resultado de la suma según el número de dígitos fraccio-
narios disponibles en el formato de representación.
Aproximación por redondeo
Para aproximar por redondeo el número 1,526246(10 al formato x1x0,x–1x–2x–3x–4 en base 10,
procederemos de la siguiente manera:
1) Sumar la mitad de la precisión del formato de representación al número que se quiere
aproximar:
1,526264(10 + 0,00005(10 = 1,526314(10
Para hacer el redondeo, sumamos
la mitad de la precisión porque
equivale a sumar la mitad de la
distancia entre dos números
representables consecutivos.
32
© FUOC • PID_00153515
Representación de la información numérica
2) Truncar el resultado de la suma según el número de dígitos fraccionarios disponibles
en el formato de representación:
1,526314(10 → 1,5263(10
Por lo tanto, el número 1,526264(10 se aproxima por redondeo a este formato por el
1,5263(10.
El inconveniente del redondeo es que, a diferencia del truncamiento, comporta operaciones aritméticas.
a
2.1.5. Desbordamiento
Las características y restricciones propias de los computadores hacen que el
formato de representación de los valores numéricos deba estar plenamente definido. El formato establecido fija el rango de representación.
De esta manera, si el formato es de 4 bits para representar números naturales,
el rango en decimal queda fijado en [0000(2, 1111(2] = [0(10, 15(10]. No podremos
representar números fuera de este rango. Cualquier operación que genere como
resultado un valor numérico fuera de este rango provocará desbordamiento.
El desbordamiento aparece cuando el número que se debe representar
supera el rango de representación disponible. Esto quiere decir que el
número no cabe en el formato disponible para representarlo.
En la figura siguiente, se muestra de manera gráfica una situación en la que se
produce desbordamiento:
Podemos ver un ejemplo de desbordamiento en la siguiente operación de suma, donde el formato es de 6 bits para representar números naturales:
1
+
1
← transportes
1
1
1
0
1
1
1
0
(2
1
0
0
1
0
1
(2
0
1
0
0
1
1
(2
↑
desbordamiento
← resultado
En inglés, el término
desbordamiento recibe
el nombre de overflow.
© FUOC • PID_00153515
33
Representación de la información numérica
El resultado de la suma anterior requiere 7 bits y por tanto está fuera del rango
de representación del formato en el que se trabaja. El formato definido sólo
puede almacenar los 6 bits de menos peso. No puede incluir el bit más significativo, porque no cabe en los 6 bits disponibles y, por lo tanto, el resultado
almacenado es erróneo.
El desbordamiento puede aparecer en todos los sistemas de representación numérica, pero se manifiesta de distintas maneras, según el sistema de representación.
a
Hay un tipo especial de desbordamiento que recibe el nombre de desbordamiento a cero y que aparece cuando un número de magnitud pequeña, pero
diferente de cero, finalmente se acaba representando, a causa del error de representación, como cero.
El desbordamiento a cero se produce cuando intentamos representar un
número distinto de cero que es de menos magnitud que la precisión del
formato de representación y la aproximación por truncamiento o redondeo utilizada hace que el número finalmente representado sea el cero.
Esta situación es relevante por las implicaciones que comporta la reducción a
cero de un número distinto de cero. Operaciones que a priori no deberían presentar ningún tipo de dificultad pueden llegar a ser irresolubles. Esto es especialmente crítico en el caso de las operaciones de división.
Actividades
16. Determinad el rango y la precisión de los formatos x1x0,x−1x−2x−3 y x2x1x0,x−1x−2, donde xi es un dígito decimal.
17. Determinad si el número 925,4(10 se puede representar en los formatos indicados en
la actividad 16.
18. Representad en el formato x1x0,x−1x−2, donde xi es un dígito decimal, los siguientes
números:
a) 10(10
b) 10,02(10
c) 03,1(10
d) 03,2(10
19. Determinad la cantidad de números que se pueden representar en el formato
x2x1x0,x−1x−2x−3, donde xi es un dígito decimal.
20. Calculad el error de representación (con aproximación por truncamiento) que se comete cuando representamos en el formato x2x1x0,x−1x−2, donde xi es un dígito decimal,
los siguientes números:
a) 22,345(10
b) 45,89(10
c) 55,6356(10
d) 23,56(10
21. Elegid la representación hexadecimal que utilice el mínimo número de dígitos y que permita representar el número 16,25(10. ¿Cuál es el rango y la precisión de esta representación?
22. ¿Cuál es el menor número que hay que sumar a 8341(10 para que se produzca desbordamiento en una representación decimal (base 10) de cuatro dígitos?
En inglés, el desbordamiento a cero
recibe el nombre de underflow.
34
© FUOC • PID_00153515
Representación de la información numérica
2.2. Números naturales
Los números naturales son los números sin parte fraccionaria y sin signo. Es
decir, son los miembros de la sucesión: 0, 1, 2, 3, 4, 5, 6…
Para la representación de estos números dentro de los computadores, nos tenemos que ajustar al número de bits disponibles en el formato de representación y en la base de representación.
Habitualmente se trabaja en base 2 y, eventualmente, en base 16 para reducir
la longitud de los números, aprovechando la correspondencia directa entre un
Podéis ver los cambios de base
entre b y bn del subapartado 1.3.3
de este módulo.
dígito hexadecimal y un grupo de cuatro dígitos binarios.
Al tratarse de números naturales, la precisión de la representación es 1, ya
que no tenemos dígitos fraccionarios, mientras que el rango depende del
número de dígitos disponibles. Los márgenes del rango los fijan la mayor
n
magnitud representable, que con n bits es 11 ··· 1(2 y equivale al valor decimal
2n − 1, y la menor magnitud representable, que es cero (cuando todos los bits
son cero).
El rango de representación de los números naturales en un formato de
n bits es, en decimal, [0, 2n − 1], y su precisión es 1.
El rango de representación se puede ampliar si aumentamos el número de bits
de la representación. La ampliación del número de bits de un formato de representación recibe el nombre de extensión.
La extensión de los números naturales representados en un formato de
n bits a un formato de m bits, con m mayor que n, se consigue añadien-
do, a la izquierda de la codificación, los ceros necesarios hasta completar los m bits del formato nuevo.
La representación del número natural 10(10 en un formato de 5 bits es 01010(2.
La extensión de esta codificación a un formato de 8 bits se consigue añadiendo
ceros a la izquierda hasta completar los 8 bits del formato nuevo, con lo cual
la nueva codificación será 00001010(2.
Las operaciones de suma y de resta siguen las pautas expuestas anteriormente.
Sólo hay que remarcar la posibilidad de que aparezca desbordamiento si el resultado de una operación de suma no cabe en el formato de representación,
una situación que detectaremos por la existencia de transporte en la última
Cambio de base del
número 10(10 a base 2
Siguiendo el método basado
en el teorema de la división
entera:
10 = 5 · 2 + 0
15 = 2 · 2 + 1
12 = 1 · 2 + 0
11 = 0 · 2 + 1
10(10 = 1010(2
35
© FUOC • PID_00153515
Representación de la información numérica
etapa de suma. El siguiente ejemplo de suma de números naturales en un formato de 6 bits pone de manifiesto esta situación:
1
−
1
Podéis ver la suma y la resta en los
sistemas posicionales del subapartado
1.5 de este módulo.
← transportes
1
La suma de dos naturales
1
1
1
0
1
0
(2
0
1
0
1
0
1
(2
0
0
1
1
1
1
(2
← resultado
La suma de dos números naturales de n bits da lugar a un
resultado que como máximo
requiere n + 1 bits para su
representación.
↑
desbordamiento
La suma de estos valores numéricos produce desbordamiento, que podemos detectar porque hay un transporte en la última etapa de suma. Así
pues, el resultado no cabe en el formato de 6 bits disponibles para la representación. El resto de los números naturales no puede dar lugar a desbordamiento.
La resta de dos naturales
La resta de números naturales
no puede dar lugar a desbordamiento, porque debemos restar
la magnitud pequeña de la
grande, con lo cual el resultado
será menor o igual al mayor de
los dos operandos. Restar la
magnitud grande de la magnitud pequeña no es una operación válida dentro del conjunto
de los números naturales, porque el resultado debería ser
un número con signo.
El desbordamiento en la suma de dos números naturales se produce
cuando tenemos un transporte en la última etapa de suma. La operación de resta de números naturales no puede dar lugar a desbordamiento.
Las operaciones de multiplicación y división entera por potencias de la base
de numeración se ajustan a los procedimientos ya descritos.
La operación de división entera por una potencia de la base de numeración no
puede dar lugar a desbordamiento, puesto que da como resultado dos números
naturales (cociente y resto) que son menores que el dividendo. La multiplicación dará desbordamiento cuando el resultado supere el número de dígitos
a
disponibles en el formato.
2.3. Números enteros
El conjunto de los números enteros es el conjunto de los números con signo
y sin parte fraccionaria, incluyendo el cero: …−3, −2, −1, 0, +1, +2, +3… El elemento destacable respecto de los números naturales es la presencia de un signo que indica si la magnitud es positiva o negativa.
Para incorporar la información adicional que supone la inclusión del signo en
la representación de los valores numéricos dentro de los computadores, hay
diferentes alternativas. En los siguientes subapartados, describimos las más
utilizadas: signo y magnitud, complemento a 2 y exceso a M.
Podéis ver la multiplicación y la
división por potencias de la base de
numeración en el subapartado 1.6
de este módulo.
La división
de dos naturales
La operación de división sobre
números naturales tiene que
ser la división entera, puesto
que los números naturales no
tienen parte fraccionaria.
36
© FUOC • PID_00153515
Representación de la información numérica
2.3.1. Representación de enteros en signo y magnitud en base 2
Signo y magnitud es, probablemente, la manera más intuitiva de representar
números con signo. En la representación con el formato de signo y magnitud de los números binarios con signo, el bit más significativo (MSB) se reserva
para almacenar el signo y el resto de los bits se dejan para representar la magnitud del valor numérico. Un 1 en el dígito más significativo indica signo negativo, mientras que un 0 indica signo positivo.
De esta manera, si la cadena de bits 101001(2 representa un valor numérico co-
MSB y LSB
MSB es la abreviación de most
significant bit, es decir, el bit
más significativo de la representación, que se corresponde
con el dígito del extremo izquierdo. LSB es la abreviación
de least significant bit, es decir,
el bit menos significativo de la
representación, que se corresponde con el dígito del extremo derecho.
dificado en el sistema de signo y magnitud, sabremos que se trata de un valor
negativo, puesto que el bit más significativo es 1. La magnitud representada
será 01001(2, que en base 10 corresponde a 9(10. Consiguientemente, el número codificado en esta cadena de bits es el valor −9(10.
Con n bits para la representación, un valor numérico entero codificado en
signo y magnitud viene determinado por la cadena de bits xn−1xn−2…x1x0,
donde xn−1 representa el signo y xn−2…x1x0, la magnitud. El bit más significativo (xn−1) representa un signo positivo cuando el valor sea 0 y un
signo negativo cuando el valor sea 1.
La magnitud a la que se hace referencia en esta representación es un valor entero, ya que tratamos sobre la representación de números enteros. Ahora bien,
en este sistema de representación también es habitual codificar números con
a
parte fraccionaria, tal y como se explica más adelante.
Representación en signo y magnitud
Dentro del computador, la base de trabajo habitual es la base 2. Para representar el valor
−12(10 en el sistema de signo y magnitud, con seis dígitos y base 2, deberemos convertir
la magnitud 12(10 a base 2 (12(10 = 1100(2) y poner el bit más significativo de la representación (el bit de más a la izquierda) en 1. La representación será, por lo tanto, 101100(2.
El valor +12(10 se representará en las mismas condiciones como 001100(2. Sólo cambia el
valor del dígito más significativo. Los dígitos que codifican la magnitud no varían.
Rango de representación en signo y magnitud y base 2
El formato de signo y magnitud es simétrico, es decir, una vez fijado un número de dígitos para la representación, se pueden representar tantos valores
positivos como negativos. De esta manera, si disponemos de 4 bits para representar valores numéricos en signo y magnitud, destinaremos el dígito de más
peso al signo. El resto contendrá la magnitud:
a) Valores posibles de signo:
0→+
1→−
Cambio de base
del número 12(10 a base 2
Siguiendo el método basado
en el teorema de la división
entera:
12 = 6 · 2 + 0
16 = 3 · 2 + 0
13 = 1 · 2 + 1
11 = 0 · 2 + 1
12(10 = 1100(2
37
© FUOC • PID_00153515
Representación de la información numérica
b) Valores posibles para la magnitud:
000(2 = 0(10
100(2 = 4(10
001(2 = 1(10
101(2 = 5(10
010(2 = 2(10
110(2 = 6(10
011(2 = 3(10
111(2 = 7(10
Si combinamos signo y magnitud, podemos representar los valores enteros entre –7 y +7. Por lo tanto, el rango de representación es [−7, +7].
En general, en la representación de signo y magnitud en base 2, el rango de enteros representable con n bits es, en decimal:
[−(2n−1 − 1), 2n−1 − 1]
Si aplicamos esta expresión al caso de 4 bits, tenemos:
[−(24−1 − 1), 24−1 − 1] = [−(23 − 1), 23 − 1] = [−7, +7]
que es el rango al cual habíamos llegado de manera experimental.
La precisión del formato de signo y magnitud para la representación de
números enteros es 1, dado que podemos representar todos los números
enteros del rango de representación.
Si fuese necesario ampliar el rango de representación, deberíamos hacer una
extensión del formato de signo y magnitud. La extensión del formato de signo
y magnitud se consigue con el aumento del número de bits destinados a la representación de la magnitud, manteniendo el bit del extremo derecho para la
codificación del signo. La conversión de los valores codificados en el formato
original al nuevo formato extendido se consigue añadiendo los ceros necesarios a la izquierda de la magnitud y a la derecha del signo.
La extensión de los números representados en signo y magnitud en un
formato n bits a un formato de m bits, con m mayor que n, se consigue
añadiendo, a la izquierda de la codificación de la magnitud, los ceros
necesarios hasta completar los m bits del nuevo formato y manteniendo
el bit del extremo derecho para la codificación del signo.
Consiguientemente, el entero negativo 11010(2 codificado en signo y magnitud y 5 bits se puede extender a un formato de 8 bits añadiendo ceros a la derecha del signo, de manera que la codificación de este mismo número en el
Ventajas del formato
de signo y magnitud
El formato de representación
de signo y magnitud tiene ventajas a la hora de hacer unas
operaciones determinadas; por
ejemplo, facilita las operaciones de multiplicación. Para hacer una multiplicación, es
posible operar por separado las
magnitudes y los signos y juntar posteriormente los resultados obtenidos de manera
independiente.
© FUOC • PID_00153515
38
Representación de la información numérica
formato nuevo sería 10001010(2. La extensión de números positivos se hace
de la misma manera: la extensión a 8 bits de la codificación en signo y magnitud del entero positivo 01010(2 nos lleva al 00001010(2.
2.3.2. Suma y resta en signo y magnitud
Aunque intuitivamente podría parecer el método más sencillo y directo de representar números con signo, el sistema de signo y magnitud presenta dificultades para llevar a cabo la operación aritmética más habitual: la suma.
La suma de dos valores positivos o de dos valores negativos no presenta grandes problemas. Sencillamente, se identifica el signo de las magnitudes con el
análisis del bit de más peso, se suman las magnitudes y se aplica el signo correspondiente al resultado. En la suma de las dos magnitudes, puede haber
desbordamiento.
Para sumar los números 101000(2 y 101010(2 codificados en signo y magnitud
y 6 bits, seguiremos el siguiente procedimiento:
Ahora bien, la suma de un valor positivo y un valor negativo es más compleja.
En este caso, debemos analizar las magnitudes para saber cuál es la mayor y
restar la menor magnitud de la mayor magnitud. Finalmente, debemos aplicar
al resultado el signo de la mayor magnitud.
Para sumar números 001000(2 y 101010(2 codificados en signo y magnitud y 6
bits, procederemos de la siguiente manera:
Inconvenientes
del formato de signo
y magnitud
Los inconvenientes principales
del sistema de signo y magnitud son la complejidad de las
operaciones de suma y resta y
la existencia de dos representaciones para el valor 0: un 0 positivo cuando la magnitud es 0
y el signo también; y un 0 negativo, cuando la magnitud es
0 y el signo 1.
39
© FUOC • PID_00153515
En las operaciones de suma y resta de números codificados en signo y magnitud,
se puede producir desbordamiento sólo si sumamos números del mismo signo
o si restamos números de signo contrario. En estos casos, detectaremos el problema de desbordamiento en la operación de suma o resta de los módulos.
El desbordamiento en la suma de dos números del mismo signo codificados en signo y magnitud se produce cuando aparece un transporte
en la última etapa de suma. La suma de un número positivo y un número negativo no puede producir desbordamiento.
Para sumar los números 101010(2 y el 111010(2, codificados en signo y magnitud y 6 bits, examinaremos en primer lugar los signos. Se trata de dos números
negativos, ya que el bit de más peso de los dos es 1. Por lo tanto, procederemos
a la suma de las magnitudes:
1
+
1
1
1
← transportes
1
0 1 0
1 0
(2
1 1 0
1 0
(2
0 0 1
0 1
(2
← resultado
↑
desbordamiento
La suma de estos módulos en este formato provoca desbordamiento, ya que
tenemos un transporte en la última etapa. Por lo tanto, la suma de estos dos
números en signo y magnitud en este formato de 6 bits produce desbordamiento. Esto quiere decir que el resultado de la operación no cabe en el formato definido y, por lo tanto, no se puede representar.
2.3.3. Complemento a la base
En la representación de complemento a la base, los valores positivos se representan de la misma manera que en signo y magnitud, es decir, un valor entero positivo X(b, se representa por:
X(b = 0xn−2xn−3…x1x0
donde 0 indica signo positivo y xn−2… x1x0 es la magnitud.
La representación en complemento a la base se diferencia de la representación
en signo y magnitud en la manera de codificar las magnitudes negativas. La
representación de un número negativo −X(b en complemento a la base es:
−X(b = bn − |X(b|
donde |X(b| es el valor absoluto de X(b.
Representación de la información numérica
40
© FUOC • PID_00153515
Representación de la información numérica
En el sistema de representación de complemento a la base, el rango de valores
enteros que se puede representar con n dígitos es:
[−bn−1, bn−1 − 1]
Cuando se trabaja en base 2, el sistema de complemento a la base recibe el
nombre de complemento a 2, indicado habitualmente por C2 o Ca2.
Abreviamos complemento a 2
indistintamente con las expresiones
C2 o Ca2.
Representación en complemento a la base
Si asumimos la base 10 y 6 dígitos para la codificación, podemos obtener la representación del valor −12(10 en complemento a la base, de la siguiente manera:
106 − 12(10 = 1000000(10 − 12 = 999988(10
El valor −12(10 se representa como el 999988(10 en complemento a la base y 6 dígitos.
2.3.4. Representación en complemento a 2
El sistema de complemento a 2, abreviado habitualmente por Ca2 o C2, es el caso
particular de representación en complemento a la base en la cual la base es 2. Actualmente, el Ca2 es el sistema más utilizado para representar números enteros en
los computadores. Las ventajas que presenta respecto de la representación en signo y magnitud son, como se muestra más adelante, la existencia de una codificación única para el cero y la simplificación de las operaciones de suma y resta.
El formato de complemento a 2 es un sistema de numeración para representar números con signo en la base 2. En complemento a 2 se representan, por lo tanto, números positivos y números negativos.
Los números positivos en Ca2 se codifican de la misma manera que en
signo y magnitud: el bit del extremo izquierdo es 0, para indicar signo
positivo, y el resto contiene la magnitud.
La codificación de un número negativo X en Ca2 se obtiene a partir de
la operación 2n − |X| en base 2, donde |X| es el valor absoluto de X.
Como vemos, debemos conocer el número n de bits para encontrar la codificación.
a
Codificación de números negativos en Ca2
Para encontrar la codificación en Ca2 y 6 bits del valor −11010(2, haremos la siguiente
operación:
26 −⏐X⏐ = 1000000(2 −11010(2 = 100110(2
1
0
0
0
0
1
1
1
1
1
1
1
0
0
1
0
0
1
−
0
0
(2
1
0
(2
1
0
(2
Así pues, la codificación en Ca2 y 6 bits del valor −11010(2 es 100110(2.
Ventajas del formato
de Ca2
La ventajas principales del Ca2
son dos:
1) Una codificación única para
el cero.
2) Simplicidad en las operaciones de suma y resta.
Inconvenientes
del formato de Ca2
Sin que afecte a la eficiencia
dentro de los computadores,
los valores de las magnitudes
negativas codificadas en Ca2
son más difíciles de reconocer
para nosotros.
41
© FUOC • PID_00153515
Representación de la información numérica
La codificación del valor +11010(2 en Ca2 coincide con la codificación en signo y magnitud. Tendríamos un 0 para el signo y a continuación 5 bits con la magnitud: el valor
+11010(2 se codifica en Ca2 como 011010(2.
Para encontrar la codificación en Ca2 y 8 bits del valor −11010(2, haremos la siguiente
operación:
28 − |X| = 100000000(2 − 11010(2 = 11100110(2.
1
0
0
0
0
0
0
1
1
1
1
1
1
1
1
1
0
0
1
1
1
0
0
1
−
0
0
(2
1
0
(2
1
0
(2
Rango de representación en Ca2
La siguiente tabla muestra el conjunto de valores enteros representables con 4
bits en signo y magnitud y en complemento a 2 y su correspondencia:
Decimal
Binario
Signo y magnitud
Ca2
+7
+111
0111
0111
+6
+110
0110
0110
+5
+101
0101
0101
+4
+100
0100
0100
+3
+011
0011
0011
+2
+010
0010
0010
+1
+001
0001
0001
0
000
−1
−001
1001
1111
−2
−010
1010
1110
−3
−011
1011
1101
−4
−100
1100
1100
−5
−101
1101
1011
−6
−110
1110
1010
−7
−111
1111
1001
−8
−1000
No es representable
1000
0000
1000
0000
En la tabla se muestra que el rango de valores enteros representables en Ca2 y
4 bits es [−8 , +7] en decimal.
En general, el rango de valores enteros que se puede representar con n
bits en el sistema de complemento a 2 es, en decimal:
[−2n−1, 2n−1 − 1]
En la tabla…
… podemos ver que la codificación de los números positivos coincide en Ca2 y signo y
magnitud y que, por lo tanto,
el rango de representación de
los positivos es el mismo en los
dos sistemas. En cambio, en
Ca2 podemos representar un
número negativo más que en
signo y magnitud. Esta asimetría reside en el hecho de que
en Ca2 tenemos una representación única del cero. Observemos que en signo y magnitud
tenemos dos codificaciones
para el cero: 0000 y 1000.
42
© FUOC • PID_00153515
Representación de la información numérica
Si aplicamos esta expresión al caso de 4 bits:
[−24−1, 24−1 − 1] = [−23, 23 − 1] = [−8 + 7]
que coincide con el rango de valores enteros representados en la tabla anterior.
Se debe analizar con detalle el cambio que comporta en la representación de
los valores numéricos el aumento del número de bits de una codificación en
Ca2, para ampliar el rango de representación o adecuar la representación a un
formato con más bits.
La codificación de los números positivos en Ca2 coincide con la codificación
de los números positivos en signo y magnitud. Por lo tanto, la extensión de
los números positivos en Ca2 a un formato con más bits se consigue de la misma manera que en signo y magnitud: con la adición a la izquierda de tantos
a
ceros como sea necesario.
Para establecer el procedimiento que se debe seguir con los números negativos, tomamos la representación de un entero, el −10(10, y analizamos el cambio. Para encontrar la codificación en Ca2 y 5 bits de este número hacemos el
cálculo siguiente: 25−⏐−10(10⏐ = 32(10 − 10(10 = 22(10. La representación en binario del 22(10 es la codificación en Ca2 del número entero −10(10, es decir,
10110(2.
La codificación en Ca2 y 8 bits de este mismo valor, el −10(10, la encontrare-
Cambio de base
del número 22(10 a base 2
Siguiendo el método basado
en el teorema de la división
entera:
22 = 11 · 2 + 0
11 = 5 · 2 + 1
15 = 2 · 2 + 1
12 = 1 · 2 + 0
11 = 0 · 2 + 1
22(10 = 10110(2
mos haciendo el mismo cálculo: 28 − ⏐−10(10⏐ = 256(10 − 10(10 = 246(10, que, si
hacemos el cambio a base 2, nos da 11110110(2.
La representación del −10(10 en Ca2 y 5 bits es 10110(2, y la representación en
Ca2 y 8 bits es 11110110(2. Para obtener esta segunda representación a partir
de la primera, sólo debemos añadir 3 unos a la izquierda.
Por lo tanto, la extensión de la codificación en Ca2 de un valor negativo se
consigue con la adición de 1 a la izquierda, mientras que la extensión de la codificación en Ca2 de un valor positivo se consigue añadiéndole ceros. Observemos que en los dos casos, los bits que se añaden coinciden con el valor:
ceros para los positivos y unos para los negativos. Por lo tanto, conseguiremos
la extensión del formato copiando el bit a la izquierda tantas veces como sea
necesario.
La extensión de los números representados en complemento a 2 en un formato n bits a un formato de m bits, con m mayor que n, se consigue copiando a la izquierda el bit de signo tantas veces como sea necesario para
completar los m bits del formato nuevo. Este proceso recibe el nombre de
extensión del signo.
Cambio de base
del número 246(10 a base 2
Siguiendo el método basado
en el teorema de la división entera:
246 = 123 · 2 + 0
123 = 61 · 2 + 1
261 = 30 · 2 + 1
230 = 15 · 2 + 0
215 =
7·2+1
247 =
3·2+1
243 =
1·2+1
241 =
0·2+1
246(10 = 11110110(2
43
© FUOC • PID_00153515
Representación de la información numérica
Por consiguiente, el entero negativo 11010(2 codificado en Ca2 y 5 bits se puede
extender a un formato de 8 bits copiando el bit de signo a la izquierda de la representación hasta llegar a los 8 bits de la nueva representación. La codificación de
este mismo número en el formato nuevo sería 11111010(2. La extensión de números positivos se hace de la misma manera. La extensión a 8 bits de la codificación en Ca2 01010(2 nos lleva a 00001010(2,, que representa el mismo número.
2.3.5. Cambio de signo en complemento a 2
Para cambiar el signo de un valor numérico codificado en complemento a 2,
seguimos el siguiente proceso:
1) Obtenemos el complemento bit a bit de la representación en Ca2.
2) Sumamos 1 al bit menos significativo de la representación.
El complemento de un dígito xi es xi = (b − 1) − xi. En el caso de la base 2, el
complemento del dígito 0 es el 1, como vemos si aplicamos la expresión anterior al caso de la base 2: (2 − 1) − 0 = 1; el complemento del dígito 1 es el 0,
puesto que (2 − 1) − 1 = 0.
Cambio de signo en complemento a 2
Para hacer el cambio de signo del valor numérico 11000110(2 (que, si seguimos el procedimiento explicado en el apartado siguiente, veríamos que se trata del −58(10), que está
codificado en complemento a 2 y 8 dígitos, hacemos la siguiente operación:
1 1 0 0 0 1 1 0
(2
← valor numérico inicial
(2
← complemento bit a bit de la expresión inicial
1
0 0 1 1 1 0 0 1
+
← sumamos 1 al bit menos significativo del formato
1
0 0 1 1 1 0 1 0
(2
De esta operación resulta el 00111010(2, que codifica la misma magnitud, pero con signo
positivo.
Una manera alternativa y, eventualmente, más rápida de hacer un cambio de
signo es la que se explica a continuación:
1) Analizar el número de derecha a izquierda.
2) Mantener los bits hasta el primer 1 que se encuentre (incluyéndolo).
3) Hacer el complemento del resto de los bits.
Cambio de signo en complemento a 2
Para hacer el cambio de signo del valor numérico 11000110(2 (que, si seguimos el procedimiento explicado en el apartado siguiente, veríamos que se trata del −58(10), que está
codificado en complemento a 2 y 8 dígitos, seguiremos el siguiente procedimiento:
11000110
^ se mantienen los bits hasta aquí (primer 1 que encontramos, incluido éste).
10
^ complementar los bits a partir de este punto.
001110
Complemento bit a bit
Se entiende por complemento
bit a bit la sustitución de cada
dígito binario por su complementario. Cuando trabajamos
en base 2, el complementario
del dígito 0 es el 1 y el complementario del dígito 1 es el 0.
44
© FUOC • PID_00153515
De esta operación resulta el 00111010(2, que codifica la misma magnitud, pero con signo
positivo.
Para hacer el cambio de signo del valor numérico 00011110(2 (que, si seguimos el procedimiento explicado en el apartado siguiente, veríamos que se trata del +30(10), que está
codificado en formato de complemento a 2 con 8 dígitos, seguiremos el siguiente procedimiento:
00011110
^ se mantienen los bits hasta aquí (primer 1 que encontramos, incluido éste).
10
^ complementar los bits a partir de este punto.
111000
Con esta operación nos queda el 11100010 (−30(10), que codifica la misma magnitud,
pero con signo negativo.
Una alternativa a la operación 2n − |X(2| para encontrar la representación en
Ca2 de un valor negativo es aplicar un cambio de signo a la representación
en Ca2 de la magnitud positiva.
La codificación en Ca2 de las magnitudes negativas se puede conseguir
a partir de un cambio de signo en la codificación de la magnitud positiva en Ca2.
La operación es reversible, es decir, si aplicamos un cambio de signo a la codificación en Ca2 de la magnitud negativa, encontramos la codificación en Ca2
de una magnitud positiva.
a
2.3.6. Magnitud de los números en complemento a 2
Conocer la magnitud de un número positivo en Ca2 no presenta dificultades.
La codificación de los valores positivos en Ca2 es la misma que en signo y
magnitud. Por lo tanto, separamos el bit de más peso y el resto de los bits son
directamente la magnitud. Para conocer la magnitud en base 10 del número
0101(2 codificado en Ca2, separamos el bit de más peso y hacemos un cambio
de base del resto de los bits aplicando el TFN:
0101(2 → 0 101
101(2 = 1 · 22 + 0 · 21 + 1 · 20 = 5(10
Por lo tanto, la cadena de bits 0101 codifica el valor +5(10 si la interpretamos
como un número en Ca2.
Para encontrar la magnitud de un número negativo codificado en Ca2, debemos proceder de manera distinta. Disponemos de dos alternativas:
1) Partir de la expresión 2n − |X|, que es la que hemos utilizado para definir la
codificación de los números negativos en Ca2. A partir de esta expresión, y si
Representación de la información numérica
45
© FUOC • PID_00153515
aplicamos el TFN, podemos derivar otra que permite conocer con facilidad la
magnitud decimal de un valor numérico negativo expresado en Ca2.
Un método para conocer la magnitud de un valor negativo codificado
en Ca2 es expresar según la base la representación en Ca2 del valor numérico (siguiendo el TFN), pero asumiendo que el bit de signo es un dígito con signo negativo. Al hacer las operaciones en base 10, obtenemos
la representación en decimal del valor numérico.
Obtención de la magnitud decimal de un valor negativo codificado en Ca2
por aplicación del TFN
Para conocer el valor decimal que corresponde al valor 10001010(2 que está expresado en
el sistema de complemento a 2, podemos hacer el cálculo siguiente:
10001010(2 = −1 · 27 + 0 · 26 + 0 · 25 + 0 · 24 + 1 · 23 + 0 · 22 + 1 · 21 + 0 · 20 =
= −128 + 10 = −118(10
10001010(2 = −118(10
2) Aplicar un cambio de signo a la representación en Ca2 del valor negativo:
Un método alternativo para conocer la magnitud de un valor negativo
codificado en Ca2 es aplicar un cambio de signo a la representación en
Ca2 del valor negativo, con lo cual se obtiene la codificación en Ca2 de
la magnitud positiva. Para conocer el valor de la magnitud en base 10,
sólo hay que hacer un cambio de base aplicando el TFN.
Obtención de la magnitud decimal de un valor negativo codificado en Ca2
por cambio de signo
Para conocer el valor decimal que corresponde al valor 10001010(2 que está expresado en
el sistema de complemento a 2, podemos hacer el siguiente cálculo:
1) Cambio de signo del número en Ca2:
1 0 0 0 1 0 1 0
(2
← transportes
1
0 1 1 1 0 1 0 1
+
← valor numérico inicial
(2
1
0 1 1 1 0 1 1 0
← complemento bit a bit de la expresión inicial
← sumamos 1 al bit menos significativo del formato
(2
2) Hacer un cambio de base con el método basado en el TFN:
01110110(2 = 0 · 27 + 1 · 26 + 1 · 25 + 1 · 24 + 0 · 23 + 1 · 22 + 1 · 21 + 0 · 20 = +118(10
La magnitud positiva 01110110(2 en Ca2 codifica el valor decimal +118(10.
Por lo tanto, el valor decimal del número 10001010(2 codificado en Ca2 es –118(10.
Representación de la información numérica
46
© FUOC • PID_00153515
Representación de la información numérica
2.3.7. Suma en complemento a 2
El mecanismo de suma en Ca2 es el mismo que el mecanismo empleado en cualquier otro sistema posicional. Nos será de utilidad reconocer las condiciones en
las que se produce desbordamiento en Ca2 para identificar resultados erróneos
en las operaciones de suma. Recordemos que el desbordamiento se produce
cuando el resultado de una operación no cabe en el formato disponible.
Por lo tanto, cuando hacemos operaciones de suma debemos tener muy presente el formato de representación de los números y del resultado.
a
El desbordamiento
en la suma
El desbordamiento en la suma
puede aparecer porque la
suma de dos números enteros
de n bits puede dar un resultado de hasta n + 1 bits.
Podéis ver la suma y la resta
en los sistemas posicionales en el
subapartado 1.5 de este módulo.
Suma de dos valores positivos en Ca2
Al sumar dos números positivos, obtendremos un resultado correcto siempre
que el valor de la suma no supere el rango de representación. En este caso, obtendremos un signo positivo (bit de más peso a 0) y una magnitud que corresponderá a la suma de las magnitudes de los operandos.
Consideramos un formato de 6 bits para representar números enteros en Ca2
y hacemos la suma siguiente:
+
0
0
1
0
1
0
(2
→
0
0
0
1
0
1
(2
→
0
0
1
1
1
1
(2
→
+10 (10
+
+5 (10
+15 (10
(resultado correcto)
Sumamos dos valores positivos y obtenemos una magnitud positiva. Por lo
tanto, el resultado es correcto.
Ahora bien, si el resultado de la suma supera el rango de representación, no se
podrá representar en el formato definido. Esta situación la detectaremos porque la suma de dos valores positivos dará lugar a un resultado negativo (bit de
más peso a 1).
Con el mismo formato de 6 bits para representar números enteros en Ca2,
consideramos la siguiente operación:
1
1
1
1
0 1 0 1 1 0
← transportes
→
(2
+22
(10
+ 0 0 1 1 1 1
(2
→
+ +15
(10
1 0 0 1 0 1
(2
→
−27
(10
(desbordamiento)
En este caso, hemos sumado dos valores positivos y obtenemos una magnitud
negativa. El resultado no es correcto. El rango de representación de este formato es [−26, +26−1 − 1] = [−32, +31], mientras que el valor de la magnitud del resultado debería ser 37(10 (22(10 + 15(10 = 37(10), que queda fuera de este rango.
Podemos encontrar la
correspondencia entre los números en
Ca2 y los valores decimales por aplicación
de cualquiera de los dos métodos expuestos
en el subapartado 2.3.6.
47
© FUOC • PID_00153515
Representación de la información numérica
En esta suma se ha producido desbordamiento, porque el resultado no cabe en
el formato definido.
Detectaremos el desbordamiento en la suma de dos valores positivos
codificados en Ca2 cuando el resultado sea negativo.
Suma de dos valores negativos en Ca2
De la misma manera que en el caso anterior, la suma de dos valores negativos
en Ca2 dará un resultado correcto siempre que el resultado no supere el rango
de representación del formato definido.
Consideramos de nuevo un formato de 6 bits para la representación de números enteros en Ca2 y hacemos la operación siguiente:
1
← transportes
1 1 1 0 1 0
(2
→
1 1 0 1 0 1
(2
→
1 1 0 1 1 1 1
(2
→
1
+
−6
+
(10
−11 (10
−17 (10
(resultado correcto)
Al hacer la operación, obtenemos el resultado correcto, ya que no se supera el
rango de representación que es [−26, +26−1 − 1] = [−32, +31]. Observemos que
aparece un transporte en la etapa de más peso. Este transporte no indica desbordamiento y se debe despreciar.
Analizamos ahora el resultado de la operación siguiente:
1
+
1 1 1
← transportes
1 0 0 1 1 0
(2
→
1 0 1 1 1 1
(2
→
1 0 1 0 1 0 1
(2
→
−26 (10
+
−17 (10
+21 (10
(desbordamiento)
Como en el caso anterior, hay un transporte en la última etapa que se debe
despreciar, pero el resultado es positivo cuando hemos sumado dos valores negativos. Por lo tanto, hay desbordamiento.
Es importante recordar que el transporte que se puede producir en la última
etapa de una suma de números codificados en Ca2 no indica desbordamiento
y hay que despreciarlo.
a
El desbordamiento en una suma de valores en Ca2 se puede dar cuando sumamos dos números positivos o dos números negativos, y lo detectaremos porque el resultado es de signo contrario a los operandos.
a
Podemos encontrar la
correspondencia entre los números en
Ca2 y los valores decimales si aplicamos
cualquiera de los dos métodos expuestos
en el subapartado 2.3.6 de este módulo.
48
© FUOC • PID_00153515
Representación de la información numérica
Detectaremos el desbordamiento en la suma de dos valores negativos
codificados en Ca2 cuando el resultado es positivo. El transporte de la
última etapa no indica desbordamiento y hay que despreciarlo en todos
los casos.
Suma de un valor positivo y un valor negativo en Ca2
El resultado de la suma de un valor positivo y un valor negativo en Ca2 siempre será correcto, porque el resultado de la suma siempre cabrá en el formato
definido (ya que se tratará de un valor de menor magnitud que el mayor de
los dos operandos).
Con el formato de 6 bits para la representación de números enteros en Ca2,
hacemos las operaciones siguientes de suma:
← transportes
1 1
+
1 1 1 0 1 0
(2
→
−6 (10
1 0 0 1 1 0
(2
→
−26
(10
0 1 0 1 0 1
(2
→ + +21 (10
+ 0 1 0 0 0 1
(2
→
+ +17
(10
1 0 0 1 1 1 1
(2
→
1 1 0 1 1 1
(2
→
−9
(10
+15 (10
(resultado correcto)
(resultado correcto)
El resultado es correcto en los dos casos. Observemos que en la suma de la izquierda aparece un transporte a la etapa de más peso, que no indica desbordamiento y que hay que despreciar.
La suma de un número positivo y un número negativo, si los dos están
codificados en Ca2, no puede producir desbordamiento. El transporte
que se puede producir en la última etapa no indica desbordamiento y
hay que despreciarlo en todos los casos.
2.3.8. Resta en complemento a 2
Cuando trabajamos con números codificados en Ca2, la operación de resta no
se hace directamente. El procedimiento habitual es aplicar un cambio de signo
al sustraendo (operando que queremos restar) y a continuación hacer una operación de suma. Sumamos el minuendo con el sustraendo al que hemos cambiado el signo.
La operación de resta en Ca2 se reduce a una operación de suma una vez
se ha cambiado el signo del sustraendo.
Podéis ver la correspondencia
entre los números en Ca2 y los valores
decimales aplicando cualquiera de los
dos métodos expuestos en el subapartado
2.3.6 de este módulo.
49
© FUOC • PID_00153515
Representación de la información numérica
La resta 011010(2 − 001011(2 (26(10 − 11(10) nos servirá de ejemplo para ilustrar
el procedimiento:
1) Aplicamos un cambio de signo al sustraendo:
001011(2 → complemento bit a bit → 110100(2
Sumamos 1 al bit menos significativo:
1 1 0 1 0 0
(2
1
(2
1 1 0 1 0 1
(2
+
2) Hacemos la operación de suma:
1
← transportes
0 1 1 0 1 0
(2
→
1 1 0 1 0 1
(2
→
1 0 0 1 1 1 1
(2
→
1
+
Podéis ver la correspondencia entre
los números en Ca2 y los valores
decimales aplicando cualquiera de los dos
métodos expuestos en el subapartado
2.3.6 de este módulo.
+26 (10
+
−11 (10
+15 (10
(resultado correcto)
El resultado es correcto. El transporte de la última etapa hay que despreciarlo
y no se produce desbordamiento. Recordemos que la suma de un número po-
a
sitivo y un número negativo no puede dar lugar a desbordamiento.
2.3.9. Multiplicación por 2k de números en complemento a 2
Como hemos visto, multiplicar o dividir por 2k números representados en
sistemas de numeración posicionales de base fija igual a 2 es equivalente a
Podéis ver la multiplicación y la
división por potencias de la base de
numeración en el subapartado 1.6
de este módulo.
desplazar la coma fraccionaria k posiciones a la derecha o a la izquierda, respectivamente.
En la representación de números enteros en Ca2, la parte fraccionaria es nula.
Podemos interpretar que la coma está a la derecha del dígito de menos peso de
la representación y es inamovible. Ahora bien, podemos conseguir el mismo
efecto de desplazamiento de la coma si desplazamos los bits a la derecha o a la
izquierda según corresponda.
De esta manera, para multiplicar el número 000101(2 en Ca2 y 6 bits por 22,
desplazamos los bits dos posiciones a la izquierda y completamos a la derecha
con los ceros necesarios (en este caso, dos):
000101(2 · 22 = 010100(2 (en decimal, +5(10 · 22 = +20(10)
Por aplicación del TFN
000101(2 = 1 · 22 + 1 · 20 = 5(10
010100(2 = 1 · 24 + 1 · 22 = 20(10
50
© FUOC • PID_00153515
Si aplicamos este procedimiento, obtenemos el resultado correcto. También se
obtiene el resultado correcto en el caso de números negativos:
111000(2 · 22 = 10000(2 (en decimal, −8(10 · 22 = −32(10 )
Este procedimiento para obtener de manera sencilla el resultado de este tipo
de operación es aplicable a todos los números representados en Ca2.
El resultado de multiplicar por 2k un número en Ca2 se consigue desplazando los bits k posiciones a la izquierda y añadiendo a la derecha
los 0 necesarios para completar los n bits del formato.
Sin embargo, esta operación produce desbordamiento cuando el resultado no
cabe en los n bits del formato en Ca2. Las operaciones siguientes provocan
desbordamiento y, consiguientemente, un resultado erróneo:
000101(2 · 24 = 010000(2 (en decimal, +5(10 · 24 = +16(10)
111000(2 · 24 = 00000(2 (en decimal, −8(10 · 24 = 0(10 )
El desbordamiento se produce cuando se pierden los dígitos significativos al
hacer el desplazamiento. Observemos que los dígitos significativos son los 1
en el caso de los positivos y los 0 en el caso de los negativos.
Se produce desbordamiento al multiplicar un número en Ca2 por 2k
cuando se pierden uno o más bits significativos al desplazar los bits k
posiciones.
En números positivos, se dará cuando se pierda algún 1 en el desplazamiento, mientras que en los números negativos se dará cuando se pierda algún 0.
2.3.10. Representación en exceso a M
El exceso a M es un tipo de representación de números enteros muy utilizado para codificar el valor del exponente cuando se trabaja en notación
científica.
La estrategia que sigue este sistema de representación es hacer un traslado del
conjunto de números que hay que representar, de manera que el valor más negativo esté codificado por el valor cero.
a
Representación de la información numérica
Las magnitudes decimales
Las magnitudes decimales son:
111000(2 =
= −1 · 25 + 1 · 24 + 1 · 23 = −8(10
100000(2 = −1 · 25 = −32(10
© FUOC • PID_00153515
51
El resto de los valores se codifican a partir del 0 en orden ascendente. La figura
siguiente muestra gráficamente esta estrategia:
Lo que se consigue de esta manera es transformar el conjunto de valores enteros representables a un conjunto de números naturales. El mecanismo que
permite esta transformación es la aplicación de un desplazamiento.
Consideremos el intervalo [−5, +5]. Para desplazar este rango de valores enteros a un conjunto de valores naturales, sólo debemos sumar 5 a cada número
entero del intervalo. De esta manera, los números pasan a estar en el intervalo
[0, 10]. Con este desplazamiento, el valor entero −5 da lugar al valor natural
0, ya que −5 + 5 = 0; el valor +2 da lugar al valor natural 7, ya que 2 + 5 = 7; etc.
El intervalo [a, b] de números enteros se puede desplazar al intervalo
de números naturales [0, b + a] si sumamos −a a cada entero del intervalo [a, b].
El desplazamiento de un intervalo de valores enteros a un intervalo de valores
naturales permite utilizar las técnicas de representación de números naturales
para codificarlos. Este tipo de estrategia se denomina representación en exceso a M, donde M es el desplazamiento que se aplica al intervalo de enteros que
se quiere codificar.
La representación en exceso a M de un número entero X se obtiene si
sumamos el desplazamiento M al valor numérico X. Consiguientemente, encontraremos el valor de un número codificado en exceso a M si
restamos M a la codificación.
A modo de ejemplo, podemos decir que en una representación en exceso a 10
el número entero −4 se representa con el número natural 6, y que el 0 se representa con el número 10.
Puesto que dentro del computador la información se codifica en binario, los
números naturales utilizados en la representación en exceso a M se codifican
a
en binario.
Representación de la información numérica
52
© FUOC • PID_00153515
Representación de la información numérica
Representación en exceso a M
Para representar el valor –6(10 en exceso a 7 y 4 bits, procederemos de la siguiente manera:
1) Sumamos el desplazamiento para encontrar la codificación en decimal –6(10 + 7(10 = 1(10.
2) Codificamos en binario y 4 bits el número obtenido 1(10 = 0001(2.
El valor –6(10 se codifica en exceso a 7 y 4 bits como 0001.
Para representar el valor +3(10 en exceso a 7 y 4 bits, procederemos de la siguiente manera:
1) Sumamos el desplazamiento para encontrar la codificación en decimal 3(10 + 7(10 = 10(10.
2) Codificamos en binario y 4 bits el número obtenido 10(10 = 1010(2.
El valor +3(10 se codifica en exceso a 7 y 4 bits como 1010.
Para saber qué valor representa la cadena de bits 1101 que está codificada en exceso a 7
y 4 bits, procederemos de la siguiente manera:
1) Hacemos un cambio de base para encontrar la codificación en decimal 1101(2 = 13(10.
2) Restamos el desplazamiento para encontrar el valor codificado 13(10 – 7(10 = +6(10.
El valor que representa la cadena de bits 1101 codificada en exceso a 7 y 4 bits es +6(10.
Para saber qué valor representa la cadena de bits 0101 que está codificada en exceso a 7
y 4 bits, procederemos de la siguiente manera:
1) Hacemos un cambio de base para encontrar la codificación en decimal 0101(2 = 5(10.
2) Restamos el desplazamiento para encontrar el valor codificado 5(10 – 7(10 = –2(10.
Rango de representación en exceso a M
Consideremos un formato de 2 dígitos decimales para la representación de números enteros en exceso a 3. El menor número que podremos representar será
el número X, que hace cierta la ecuación X(10 + 3(10 = 0(10, es decir, el valor −3(10.
De una manera semejante, el mayor número que se puede representar es el que
Recordemos que…
… la representación en exceso
a M desplaza el número más
negativo que se podrá representar en el valor 0.
hace que X(10 + 3(10 = 99(10, es decir, el +96(10. En exceso a 3, el valor −3(10 se codifica como 0(10 y el valor +96(10 como 99(10, que corresponden a los límites
del intervalo de números naturales representables con 2 dígitos decimales. Por
lo tanto, en el formato definido el rango de valores enteros que podemos representar en exceso a 3 es el [−3(10, +96(10], donde podemos ver que la magnitud del valor más negativo que se puede representar, (−3(10), coincide con la
magnitud del desplazamiento (3(10).
El rango de valores enteros que se puede representar en exceso a M y
n bits es:
[−M, 2n − 1 − M]
El valor que tomará M dependerá de la aplicación en la que se utilicen los enteros
codificados en el sistema de exceso. Ahora bien, es habitual que M tome el valor
2n−1, en el que n es el número de bits disponibles para la representación. De esta
manera, se dispone de un rango equilibrado. El rango de representación en exceso
a M cuando M toma el valor 2n−1 es el mismo que el rango en complemento a 2:
[−2n−1, 2n−1 − 1]
Recordemos que…
… el rango de representación
de números naturales con n
bits es [0, 2n − 1]. El rango en
exceso a –M se obtiene si sumamos el desplazamiento M al
intervalo [0 – M, 2n – 1 – M].
Otros valores habituales
del exceso
También es habitual encontrar
sistemas de representación
en exceso a M que utilicen
M = 2n−1 − 1. El sistema más
conocido que lo utiliza es
el estándar IEEE754.
53
© FUOC • PID_00153515
Representación de la información numérica
Este valor de M también permite diferenciar fácilmente los números negativos
de los positivos: todos los negativos empiezan por 0 y todos los positivos (incluido el 0), por 1. A pesar de todo, este bit inicial no se considera un bit de
signo. Si no se dice explícitamente otra cosa, en este curso asumiremos siem-
a
pre que M = 2n−1.
Para conocer la manera en la que cambia la representación en exceso a M con
la ampliación del número de bits del formato, debemos establecer cómo afecta
el cambio al valor de M. Hay dos escenarios posibles:
1) Que se mantenga el valor de M, a pesar del cambio en el número de bits del
formato de representación.
2) Que se ajuste el valor de M al formato nuevo, que es el caso más habitual.
El primer caso es el más simple. Para convertir la codificación en exceso a M
de un formato de n bits a un formato n + p bits, sólo hay que añadir p ceros
a la izquierda. Por ejemplo, en exceso a 8 y 4 bits, el −2(10 se codifica como
8(10 + (−2(10) = +6(10 = 0110(2. Si se mantiene el valor de M, la extensión de
esta codificación a un formato de 8 bits se consigue con la adición de 0 a la
izquierda, con lo cual se obtiene 00000110(2.
La extensión a n + p bits de la codificación en exceso a M de n bits
manteniendo fijo el valor de M se consigue con la adición de p ceros
a la izquierda de la codificación. Este procedimiento es válido independientemente del valor de M.
El segundo caso es el más habitual y comporta cambios importantes en la codificación. En la tabla siguiente, se muestra cómo cambian las codificaciones de
números en exceso a 4 y 3 bits con la ampliación del formato y el cambio de M
según el número de bits. Se asume que M toma el valor 2n−1, en el que n se ajusta
al número de bits, y se marcan en negrita los bits que diferencian la nueva codificación de la inicial en exceso a 4:
Decimal
Binario
Exceso a 4
con 3 bits
Exceso a 8
con 4 bits
Exceso a 16
con 5 bits
Exceso a 32
con 6 bits
−4
−100
000
0100
01100
011100
−3
−011
001
0101
01101
011101
−2
−010
010
0110
01110
011110
−1
−001
011
0111
01111
011111
0
000
100
1000
10000
100000
+1
+001
101
1001
10001
100001
+2
+010
110
1010
10010
100010
+3
+011
111
1011
10011
100011
54
© FUOC • PID_00153515
A partir de esta tabla, podemos extrapolar una conclusión.
La extensión a n + p bits de la codificación en exceso a M de n bits,
en la que M toma el valor M = 2n+p−1, se consigue añadiendo p unos
puntos a la derecha del dígito de más peso para el caso de los números
negativos y añadiendo p ceros a la derecha del dígito de más peso para
el caso de los números positivos, incluido el 0. Este procedimiento es
válido para M = 2n+p−1, donde n + p es el número de bits.
La representación en exceso a M se utiliza para codificar de manera exacta los
números enteros contenidos en el intervalo que determina el rango de representación. Por lo tanto, la precisión es 1.
a
La precisión de una representación en exceso a M de números enteros
es 1.
Suma y resta en exceso a M
La suma y la resta en exceso a M presenta un problema: la codificación en exceso
a M de todo valor numérico comporta un desplazamiento de magnitud M.
Tomamos, por ejemplo, los números 10(10 y 14(10. La suma de estos números
es 10(10 + 14(10 = 24(10. La codificación decimal en exceso a 16 del número 24(10
se obtiene si sumamos el desplazamiento: 24(10 + 16(10 = 40(10.
Ahora bien, cuando trabajamos con números codificados en exceso a M nos sería útil conseguir el resultado correcto de la suma a partir de las codificaciones.
Tomamos ahora las codificaciones decimales en exceso a 16 de los mismos
números, que son, respectivamente, 26(10 para el 10(10 (que se obtiene de
10(10 + 16(10 = 26(10) y 30(10 para el 14(10 (que se obtiene de 14(10 + 16(10 = 30(10).
La suma de las codificaciones es:
26(10 + 30(10 = (10(10 + 16(10) + (14(10 + 16(10) =
= 10(10 + 14(10 + 16(10 + 16(10 = 10(10 + 14(10 + (2 × 16(10) = 56(10.
Los resultados obtenidos son distintos: 40(10 en el primer caso y 56(10 en el segundo. Vemos que cuando sumamos las codificaciones sumamos dos veces el
desplazamiento, que en este caso es 16. Por lo tanto, para obtener la codificación
correcta del resultado tenemos que restar el desplazamiento: 56(10 − 16(10 = 40(10.
Es decir, al sumar las codificaciones sumamos el exceso dos veces. Las codificaciones en exceso a M de dos valores X e Y son, respectivamente, X + M e
Representación de la información numérica
55
© FUOC • PID_00153515
Y + M. Al hacer la suma de las codificaciones, sumamos dos veces el despla-
zamiento:
(X + M) + (Y + M) = X + Y + 2 · M
El resultado que obtenemos es X + Y + 2 · M, cuando en realidad el resultado
debería ser X + Y + M. Obtendremos la codificación correcta si restamos M al
resultado de la suma.
El resultado correcto en la suma de dos valores numéricos codificados
en exceso a M se obtiene si restamos el desplazamiento M al resultado.
Suma de números codificados en exceso a M
Para sumar los números binarios 00001100(2 y 11001111(2 codificados en exceso a 27
(27(10 = 10000000(2) y 8 bits, haremos las operaciones:
+
−
1
1
← transportes
0
1
1
0
1
1
0
0
0
0
0
1
1
1
1
1
1
0
0
1
1
0
1
1
1
1
0
1
0
1
0
0
0
1
0
1
1
0
0
0
0
0
1
0
1
1
0
1
(2
(2
(2
(2
(2
(2
En el caso de la resta, encontramos una dificultad semejante. La codificación
en exceso a M de los valores numéricos X e Y son, respectivamente, X + M e
Y + M. El resto de estas codificaciones hace que desaparezca el desplazamiento:
(X + M) − (Y + M) = X + M − Y − M = X − Y + M − M = X − Y
La codificación correcta del resultado es X − Y + M. Conseguiremos esta codificación si sumamos M al resultado de la resta.
El resultado correcto en la resta de dos valores numéricos codificados en
exceso a M se obtiene si sumamos el desplazamiento M al resultado.
Resta de números codificados en exceso a M
Para restar los números binarios 00001100(2 y 10000100(2, codificados en exceso a 27
(27(10 = 10000000(2) y 8 bits, haremos las operaciones:
0
0
0
0
1
1
0
0
(2
← transportes
1
−
1
0
0
0
0
1
0
0
(2
1
0
0
0
1
0
0
0
(2
1
0
0
0
1
0
0
0
(2
1
0
0
0
0
0
0
0
(2
0
0
0
0
1
0
0
0
(2
← transportes
1
+
Representación de la información numérica
56
© FUOC • PID_00153515
El desbordamiento en las operaciones de suma y resta de valores codificados
en exceso a M, donde M es 2n−1 y n el número de bits, se detecta al hacer la
corrección del resultado. Cuando la suma o la resta del desplazamiento M que
hacemos para corregir el resultado genera un transporte en la última etapa,
hay desbordamiento.
Consideremos una representación en exceso a 2 y 2 bits. La codificación del
valor 1(10 en este sistema es 1(10 + 2(10 = 3(10 = 11(2. Si sumamos este valor codificado consigo mismo, obtenemos:
← transporte
1
+
1
1
1 (2
1
1 (2
1
0 (2
← transporte
1
1
1
1
0 (2
1
0
0
−
0
Hay desbordamiento, porque en la última etapa del resto del desplazamiento
realizada para corregir el resultado se produce un transporte.
En la operación de resta, la manera de detectar el desbordamiento es idéntica. Si consideramos la representación en exceso a 4 y 3 bits, la codificación del valor 2(10 en este sistema es 2(10 + 4(10 = 6(10 = 110(2 y la del valor
−2(10 es −2(10 + 4(10 = 2(10 = 010(2. De la operación de resta de estos valores
obtenemos:
1 1 0 (2
−
0 1 0 (2
1 0 0 (2
← transporte
1
1 0 0 (2
+
1 0 0 (2
1
0 0 0 (2
También ahora detectamos que hay desbordamiento, porque en la última etapa de la suma del desplazamiento realizada para corregir el resultado se produce un transporte.
Detectaremos el desbordamiento en las operaciones de suma y resta
de valores binarios codificados en exceso a M, cuando M es 2n−1, donde
n es el número de bits, porque la operación de corrección del resultado
genera un transporte en la última etapa.
Representación de la información numérica
57
© FUOC • PID_00153515
Representación de la información numérica
Actividades
23. Convertid los valores decimales siguientes a binarios en los sistemas de representación de signo y magnitud y complemento a 2, con un formato entero de 8 bits:
a) 53
b) −25
c) 93
d) −1
e) −127
f) −64
24. Si tenemos los números binarios 00110110, 11011010, 01110110, 11111111 i 11100100,
¿cuáles son los equivalentes decimales, sin consideramos que son valores binarios representados en signo y magnitud? ¿Y si los consideramos valores en complemento a 2?
25. Tenemos las cadenas de bits siguientes: A = 1100100111, B = 1000011101 y C =
0101011011. Haced las operaciones que proponemos a continuación, si consideramos que
son números binarios en formato de signo y magnitud: A + B, A − B, A + C, A − C, B − C, B + C.
26. Repetid la actividad 25, considerando que las cadenas representan números en complemento a 2.
27. Tenemos la cadena de bits 10110101. Haced las siguientes conversiones:
a) Tened en cuenta que representa un número en Ca2 y representad el mismo número
en signo y magnitud y 16 bits.
b) Tened en cuenta que representa un número en signo y magnitud y representad el mismo número en Ca2 y 16 bits.
28. Determinad qué desplazamiento deberíamos utilizar para poder representar el intervalo [−25,50] con una representación en exceso.
29. Haced las siguientes codificaciones:
a) Los números 3(10 y −8(10 en exceso a 7 y decimal.
b) Los números −4(10 en 6 bits y exceso a 7.
c) Los números 3(10 y −6(10 en una representación en exceso a 4 de 8 bits.
30. ¿Cuál es el valor decimal de los números 000000(2, 100000(2 i 111111(2 que están codificados en exceso a 31(10?
31. Determinad el signo de los números 0111000(2, 1001110(2 y 000000(2 codificados en
una representación de 7 bits en exceso a 26.
32. Sumad los números 000100 y 100100 codificados en binario y exceso a 25.
33. Restad los números 000100 y 100100 codificados en binario y exceso a 25.
34. Suponed una representación de 5 bits en exceso a 10000(2 y calculad las siguientes sumas:
a) 11000 + 00000 =
b) 00000 + 00000 =
c) 01000 + 11111 =
2.4. Números fraccionarios
Como sabemos, en muchas ocasiones es necesario representar números que son
menores que la unidad, como por ejemplo 0,03(10, o que tienen partes menores
Podéis ver los sistemas de numeración
posicionales en el subapartado 1.2
de este módulo.
que la unidad, como por ejemplo 1,23(10. Estos números reciben el nombre de números fraccionarios y se representan con una notación posicional:
1,23(10 = 1 · 100 + 2 · 10−1 + 3 · 10−2
Si seguimos el método de cambio de base basado en el TFN, podremos conocer
la magnitud decimal de un número fraccionario expresado en base 2. La magnitud decimal del 111,01101(2 es la siguiente:
1 · 22 + 1 · 21 + 1 · 20 + 0 · 2−1 + 1 · 2−2 + 1 · 2−3 + 0 · 2−4 + 1 · 2−5 = 7,40625(10
Podéis ver el método basado
en el TNF en el subapartado 1.3.1
de este módulo.
58
© FUOC • PID_00153515
Representación de la información numérica
La representación de los números fraccionarios dentro de los computadores se
suele hacer destinando un número fijo de bits, del total de bits del formato, a
la representación de la parte fraccionaria. Este tipo de representación recibe el
nombre genérico de representación de coma fija.
a
Representación binaria en coma fija
Las representaciones de coma fija no almacenan la posición de la coma de
manera explícita. En la definición del formato se especifica la posición de la
coma, y se asume que siempre es la misma.
En un formato de representación de coma fija de n bits (n = p + m), donde m bits son fraccionarios, los números representados son de la forma:
La magnitud decimal del número fraccionario representado es
X(10 =
−m
∑ x · 2 , donde xi es el bit de la posición i-ésima.
i = p −1
i
i
Signo y magnitud en coma fija
Las magnitudes fraccionarias también pueden llevar asociado un signo. Para
incorporar esta información a la representación de números fraccionarios, lo
más habitual es trabajar con una representación de signo y magnitud, en la
cual la magnitud sea fraccionaria, como se indica en el subapartado 2.3.1.
En un formato de coma fija de n bits (n = p + m), donde m bits son fraccionarios, y en signo y magnitud, los números son de la forma:
donde xp−1 es el bit de signo y el resto de los bits codifican la magnitud.
Otras maneras de
representar números
Hay otras maneras de representar números fraccionarios
con signo. Por ejemplo, se podría utilizar la representación
de complemento a la base
(Ca2 en binario), pero no
es habitual.
Formato en coma fija
Esta manera de representar los
números fraccionarios es una
extensión directa de la representación en signo y magnitud
de números enteros. Por lo
tanto, presenta las mismas
ventajas e inconvenientes.
De esta manera, por ejemplo,
el 0 tiene dos representaciones, una con signo negativo
y otra con signo positivo.
© FUOC • PID_00153515
59
Representación de la información numérica
En este tipo de representación, la descodificación u obtención del número representado es relativamente sencilla, ya que sólo hay que aplicar la fórmula
definida en el TFN. Se debe saber, sin embargo, dónde está situada la coma (es
decir, hay que saber con cuántos bits fraccionarios trabajamos).
De este modo, para conocer en decimal el valor numérico representado por la
codificación 010111101 que está en magnitud y signo en un formato de 9 bits
(n = 9), de los cuales 4 son fraccionarios (m = 4), debemos seguir el procedimiento indicado en la siguiente figura:
Por lo tanto, el número codificado es +1011,1101(2 = +11,8125(10.
Magnitud decimal de un número codificado en coma fija y signo y magnitud
Para encontrar la magnitud decimal que representa la codificación 10010010 que está en
un formato de 8 bits, 4 de los cuales son fraccionarios, y en signo y magnitud, haremos
las operaciones siguientes:
1) Separamos el bit de signo que es 1 (bit del extremo izquierdo) y que indica signo negativo. El resto de los bits 0010010 codifica la magnitud.
2) El valor decimal de la magnitud lo podemos conocer si aplicamos el TFN:
0 · 22 + 0 · 21 + 1 · 20 + 0 · 2−1 + 0 · 2−2 + 1 · 2−3 + 0 · 2−4 = 1 + 0,125 = 1,125(10
Por lo tanto, el número representado en decimal es –1,125(10.
Codificación de un valor decimal en coma fija y signo y magnitud
Para codificar el número –14,75(10, en un formato de coma fija de 8 bits en el que 3 son
fraccionarios y signo y magnitud, haremos las operaciones siguientes:
1) Cambiar a base 2 el número 14,75(10 a partir del método basado en el teorema de la
división entera.
a) Codificar en binario la parte entera (14(10) en 4 bits (ya que de los 8 bits, 3 son fraccionarios y 1 codifica el signo; quedan 4 para la parte entera), aplicando el algoritmo de divisiones sucesivas:
14
7
3
1
=7×2+0
=3×2+1
=1×2+1
=0×2+1
De manera que obtenemos: 14(10 = 1110(2.
b) Codificar en binario la parte fraccionaria en 3 bits:
0,75 · 2 = 1,50 = 1 + 0,5
0,5 · 2 = 1,0 = 1 + 0,0
De manera que obtenemos: 0,75(10 = 0,110(2.
Podéis ver el método basado en
el teorema de la división entera
en el subapartado 1.3.2 de este módulo.
60
© FUOC • PID_00153515
Representación de la información numérica
c) Juntar las partes enteras y fraccionarias, con lo cual obtenemos que la representación
de la magnitud 14,75(10 con 7 bits, 3 de los cuales son fraccionarios, es:
14,75(10 = 1110,110(2
2) Añadir el bit de signo a la magnitud. El bit de signo es 1, ya que el signo es negativo.
La representación en un formato de coma fija de 8 bits, donde 3 son fraccionarios, y signo y magnitud –14,75(10, es la siguiente:
–14,75(10 = 1110,110(2
Recordemos que la coma no se almacena, sino que una vez especificado el formato se conoce su posición. En realidad, un computador almacenaría el código 11110110 sin coma
ni especificación de base, que están fijados en la definición del formato.
Cuando la representación en binario de la parte fraccionaria de un número excede el número de bits fraccionarios disponibles en el formato en signo y magnitud definido, el número no se podrá representar de una manera exacta. Será
necesario aplicar, por lo tanto, uno de los métodos de aproximación explica-
a
dos: el truncamiento o el redondeo.
Podéis ver las aproximaciones
por truncamiento y redondeo
en el subapartado 2.1.4 de este módulo.
Cambio de base 10 a base 2 del número 8,9453125(10
1. Parte entera
8=4·2+0
4=2·2+0
2=1·2+0
1=0·2+1
2. Parte fraccionaria
0,9453125 · 2
0,890625 · 2
0,781250 · 2
0,5625 · 2
0,125 · 2
0,245 · 2
0,5 · 2
= 0,890625 + 1
= 0,781250 + 1
= 0,5625 + 1
= 0,125
+0
= 0,245
+0
= 0,5
+0
=0
+1
8,9453125(10 = 1000,1111001(2
A modo de ejemplo, intentemos representar el número +8,9453125(10 en un formato de coma fija y signo y magnitud, con 8 bits de los cuales 3 son fraccionarios.
Si hacemos el cambio de base, encontramos que 8,9453125(10 = 1000,1111001(2.
Deberemos utilizar uno de los métodos de aproximación, ya que la parte fraccionaria no cabe en los 3 bits disponibles en el formato:
a) Por truncamiento. Se trata, sencillamente, de despreciar los bits que no
tienen cabida. El 1000,1111001(2 se aproximará por el 1000,111(2. Añadimos
el bit de signo y la codificación final será 01000111. El error de representación
que se comete en este caso es:
|1000,1111001(2 − 1000,111(2| = 0,0001001(2 = 0,0703125(10
b) Por redondeo. Se suma la mitad de la precisión:
1000,1111001(2 + 0,0001(2 = 1001,0000001(2
La precisión
La precisión es la distancia
entre dos números representables consecutivos (ved el
subapartado 2.1.2) . Fácilmente,
se comprueba que la precisión
con 3 bits fraccionarios es
0,001(2 (distancia entre el 0,000
y el 0,001). Para conseguir la
mitad de este valor, la coma se
desplaza una posición hacia la
izquierda (que equivale a dividir
por 2 en base 2), es decir:
0,0001(2.
61
© FUOC • PID_00153515
Representación de la información numérica
A continuación truncamos a 3 bits fraccionarios, de manera que el
1000,1111001(2 se aproximará por el 1001,000(2. Añadimos el bit de signo y la
codificación final será 01001000. En este caso, el error de representación que
se comete es menor:
|1000,1111001(2 − 1000,000(2| = 0,0000111(2 = 0,0546875(10
Rango y precisión en coma fija
La mayor magnitud binaria que podemos representar en un formato de coma
fija es la que se obtiene si ponemos todos los bits que representan la magnitud
a 1. Si el bit de signo lo ponemos a cero, tendremos la representación de la mayor magnitud positiva que se puede representar. Si el bit de signo es 1, se tratará de la mayor magnitud negativa que se puede representar. Estos números,
el mayor y el menor, delimitan el intervalo que contiene los números que se
pueden representar, es decir, el rango.
El mayor número representable en signo y magnitud y un formato de coma
fija de 9 bits con 3 fraccionarios es el 011111,111(2 = +31,875(10; el menor es
el 111111,111(2 = −31,875(10. Por lo tanto, el rango en decimal de este formato es:
[−31,875(10 + 31,875(10]
En general, el mayor número que se puede representar con n bits, m de los cuales fraccionarios, se puede calcular si suponemos que todos los bits valen 1 y
aplicamos el TFN:
1 · 2n−m−2 + 1 · 2n−m−3 + … + 1 · 20 + 1 · 2−1 + … + 1 · 2−m = 2n−m−1 − 2−m
donde hemos aplicado la siguiente propiedad:
k
111... 11 ( 2 = 2
k–1
+2
k–2
k
0
k
2 –2
2 –1
1
0
k
+ ...2 + 2 = ----------------- = --------------- = 2 – 1
2–1
1
El rango de una representación en signo y magnitud y un formato en
coma fija de n bits, donde m son fraccionarios, es el siguiente:
[−2n−m−1 + 2−m, 2n−m−1 − 2−m].
De la misma manera, el rango de una representación de números fraccionarios sin signo en un formato de coma fija de n bits, donde m son
fraccionarios, es el siguiente:
[0, + 2n−m − 2−m].
Ampliación de la parte fraccionaria
Para ampliar en 3 bits la parte fraccionaria y en 2 bits la parte entera del número 111,001(2
que está en coma fija y signo y magnitud, añadiremos 3 ceros a la derecha de la magnitud y
62
© FUOC • PID_00153515
2 ceros la izquierda de la magnitud. La nueva codificación en el caso de signo y magnitud es
10011,001000(2, en la que se marcan en negro los dígitos añadidos. Esta ampliación, si el número 111,001(2 fuese una magnitud sin signo, daría lugar a la codificación 00111,001000(2.
La ampliación de un formato en coma fija debe tener en cuenta los posibles
cambios en la posición de la coma. De hecho, sólo es necesario conocer cuántos bits se destinan a la parte fraccionaria y cuántos a la parte entera. Una ampliación de k bits de la parte fraccionaria comporta añadir k ceros a la derecha
de la magnitud. Una ampliación de p bits de la parte entera se consigue si añadimos p ceros a la izquierda de la magnitud. Si trabajamos en signo y magnitud, deberemos separar el signo de la magnitud para hacer los cambios y
después añadirlo al extremo izquierdo.
La extensión o ampliación de k bits por la parte fraccionaria y p bits
por la parte entera de un formato de coma fija, tanto en signo y mag-
nitud como sin signo, se consigue si añadimos k ceros a la derecha de la
magnitud y p ceros a la izquierda de la magnitud.
La precisión es la menor distancia entre dos números representables consecutivos. Si trabajamos con una representación en coma fija de 3 bits donde 1 es
fraccionario y signo y magnitud los números que se pueden representar son:
−1,1(2, −1,0(2, −0,1(2, 0,0(2, +0,1(2, +1,0(2 y +1,1(2. Como podemos observar, todos están separados una distancia 0,1(2. Por este motivo, la precisión es 0,1(2.
En las representaciones de coma fija, la precisión es determinada por el bit menos significativo de la representación.
a
La precisión de una representación en coma fija de n bits, donde m son
fraccionarios, es 2−m.
Suma y resta en coma fija
Las operaciones de suma y de resta en coma fija se hacen a partir del algoritmo habitual descrito en el apartado 1.5, como podemos ver en los siguientes ejemplos:
−
1
+
1
, 1
0
0
0
0
0
, 1
0
0
(2
1
, 0
0
1
(2
1
0
1
(2
← transportes
← resultado
← transportes
0
1 , 1 0 1
(2
0 , 1 0 0
(2
1 0 , 0 0 1
(2
← resultado
Representación de la información numérica
63
© FUOC • PID_00153515
Representación de la información numérica
Observemos que un número fraccionario como por ejemplo el 1,101(2 se puede escribir 1101(2 · 2−3. Con este procedimiento, podemos asociar un número
entero, en este caso el 1101(2, a un número fraccionario.
Si aplicamos esta transformación a los números 1,101(2 y 0,100(2 de la suma
anterior, obtenemos:
1,101(2 = 1101(2 · 2−3 i 0,100(2 = 0100(2 · 2−3.
La suma se puede hacer de esta manera:
1101(2 · 2−3 + 0100(2 · 2−3 = (1101(2 + 0100(2) · 2−3 = 10001(10 · 2−3
Observemos que por este procedimiento hemos transformado una suma de
números fraccionarios en una suma de números enteros.
a
Con la transformación anterior, las operaciones entre números fraccionarios se pueden llevar a cabo mediante operaciones entre números enteros.
Observemos también que en la representación no aparece la ubicación de la
coma. Sin embargo, puesto que todos los números con los que trabajaremos
tendrá la coma en la misma posición, no hay que saber su situación para operar con los mismos.
Es decir, las operaciones para sumar los números 11,01(2 y 00,01(2 o los números 1,101(2 y 0,001(2 son idénticas. La primera se puede escribir como:
11,01(2 + 00,01(2 = 1101(2 · 2−2 + 0001(2 · 2−2 = (1101(2 + 0001(2) · 2−2
y la segunda como:
1,101(2 + 0,001(2 = 1101(2 · 2−3 + 0001(2 · 2−3 = (1101(2 + 0001(2) · 2−3
En los dos casos, la operación realizada finalmente es la suma de los dos números
enteros 1101(2 y 0001(2. A continuación sumamos estos números 11,111(2 y
01,111(2, que están en un formato de coma fija de 6 bits, con 3 fraccionarios:
1
+
1
1
1
← transportes
1
1 1 1 1 1
(2
0 1 1 1 1
(2
1 0 1 1 1 0
(2
← resultado
© FUOC • PID_00153515
64
Representación de la información numérica
Para representar el resultado, necesitamos un dígito más de los que tenemos
disponibles en el formato definido. Por este motivo, el resultado no es representable en el formato especificado. Se ha producido desbordamiento, que podemos reconocer de la misma manera que en la suma de números naturales.
El desbordamiento en la suma de números sin signo en coma fija se
puede detectar de la misma manera que en el caso de la suma de números
naturales. Recordemos que la resta no puede dar lugar a desbordamiento.
El desbordamiento en la suma y la resta de números en coma fija
y signo y magnitud se puede detectar de la misma manera que en el
caso de la suma y la resta de números enteros representados en signo
y magnitud.
La resta de los números
sin signo
La resta de los números sin signo no puede dar lugar a desbordamiento, porque tenemos
que restar la magnitud pequeña de la grande. Restar la magnitud grande de la magnitud
pequeña no es una operación
válida para números sin signo,
porque el resultado debería ser
un número con signo.
Multiplicación y división por 2k en coma fija binaria
Ya hemos analizado la multiplicación y la división por potencias de la base de
numeración de manera genérica. Las operaciones de multiplicación y división
por 2k en coma fija binaria corresponden al caso particular en el que la base de
numeración es 2.
Cuando la base de numeración es 2 en un sistema posicional de base fija, los
pesos asociados a los dígitos son potencias de 2. Consiguientemente, multiplicar por 2 se traduce en aumentar en una unidad la potencia de 2 asociada a
cada bit y dividir por 2 es equivalente a disminuir en una unidad la potencia
de 2 asociada a cada bit.
Por ejemplo, el número 0011,01(2 se puede expresar en términos de los pesos
asociados a cada bit si seguimos el TFN:
0011,01(2 = 0 · 23 + 0 · 22 + 1 · 21 + 1 · 20 + 0 · 2−1 + 1 · 2−2
Si multiplicamos por 2, se obtiene:
0011,01(2 · 2 = (0 · 23 + 0 · 22 + 1 · 21 + 1 · 20 + 0 · 2−1 + 1 · 2−2) · 2 =
= 0 · 24 + 0 · 23 + 1 · 22 + 1 · 21 + 0 · 20 + 1 · 2−1 = 00110,1(2
La multiplicación o la división de un número binario por una potencia de 2
provoca el desplazamiento de la coma fraccionaria.
a
En un formato de coma fija, el número de bits que se destinan a la parte entera
y a la parte fraccionaria se mantienen constantes. Por lo tanto, para hacer multiplicaciones o divisiones por la base no es factible desplazar la coma fraccio-
Podéis ver la multiplicación y la
división por potencias de la base de
numeración del subapartado 1.6
de este módulo.
65
© FUOC • PID_00153515
naria. Conseguiremos el mismo efecto si desplazamos los bits y completamos
con ceros.
Multiplicar por 2k un número en coma fija sin signo equivocado equi-
vale a desplazar los bits k posiciones a la izquierda, y completar los n bits
del formato con la adición a la derecha de los ceros necesarios.
Dividir por 2k un número en coma fija sin signo equivale a desplazar
los bits k posiciones a la derecha, y completar los n bits del formato con
la adición a la izquierda de los ceros necesarios.
De este modo, el número 0011,01(2 representado en un formato de coma fija
de 6 bits donde 2 son fraccionarios se puede multiplicar por 22 si desplazamos
los bits dos posiciones a la izquierda y completamos con los ceros necesarios:
0011,01(2 · 22 = 1101,00(2
Esta operación puede comportar que el resultado del desplazamiento sea
un número que no cabe en el formato de coma fija especificado, de manera
que provoque desbordamiento. En los formatos de coma fija sin signo, detectaremos esta situación porque al hacer los desplazamientos a la izquierda perderemos bits significativos (diferentes de cero, en el caso de coma fija
sin signo).
Se produce desbordamiento al multiplicar un número sin signo en
coma fija por 2k cuando se pierden uno o más bits significativos (diferentes de cero) al desplazar los bits k posiciones.
El resultado de la operación de división por 2k de un número en coma fija sin
signo también se puede conseguir con desplazamientos de los bits. Para dividir
el número 010100(2 en coma fija sin signo y 6 bits, dos de los cuales son fraccionarios, por 22 desplazamos los bits dos posiciones a la derecha:
Por aplicación del TFN
0101,00(2 = 1 · 22 + 1 · 20 = 5(10
0001,01(2 = 1 · 20 + 1 · 2−2 = 1,25(10
0101,00(2 / 22 = 0001,01(2 (en decimal, +5(10 / 22 = +1,25(10)
El resultado de la división por 2k de un número en coma fija sin signo
se obtiene si desplazamos los bits k posiciones a la derecha y añadimos
a la izquierda los ceros necesarios para completar los n bits del formato.
Representación de la información numérica
66
© FUOC • PID_00153515
En el caso de la división por 2k no se puede producir desbordamiento, pero podemos perder bits significativos que hagan que el resultado no sea exacto,
como en el siguiente ejemplo:
0101,00(2 / 24 ≈ 0000,01(2 (en decimal, +5(10 / 24 ≈ + 0,25(10)
Cuando se pierden bits significativos (diferentes de cero) al desplazar los bits
a la derecha, el resultado de la operación de división por 2k no es exacto. La
pérdida de bits significativos por la derecha equivale a hacer una aproximación por truncamiento.
a
En el caso de los formatos de coma fija en signo y magnitud, las operaciones
de multiplicación y división por 2k tienen las mismas características que las
descritas más arriba para los formatos de coma fija sin signo, si dejamos de
lado el bit de signo. Es decir, una vez separado el bit de signo, nos encontramos en el mismo caso que en un formato de coma fija sin signo. El bit de signo
a
se añadirá al final de la operación.
Actividades
35. Determinad qué valor decimal codifica la cadena de bits 1010010 en los supuestos
siguientes:
a) si se trata de un número en coma fija sin signo de 7 bits, donde 4 son fraccionarios.
b) si se trata de un número en coma fija sin signo de 7 bits, donde 1 es fraccionario.
36. Codificad los números +12,85(10, +0,7578125(10 y −11,025(10 en una representación
fraccionaria binaria en signo y magnitud de 8 bits, donde 3 son fraccionarios. Si es necesario, utilizad una aproximación por redondeo.
37. Si tenemos una representación en signo y magnitud de 8 bits, donde 3 bits son fraccionarios, determinad los números codificados por las cadenas de bits 01001111,
11001111, 01010100, 00000000 y 10000000.
38. Si las cadenas de bits 00101010, 11010010 y 10100010 representan números en coma
fija sin signo de 8 bits donde 3 son fraccionarios, representadlos en formato de coma fija
sin signo de 12 bits en los que 4 son fraccionarios.
39. Repetid la actividad 38, pero considerando que se trata de números en signo y magnitud.
40. Determinad el rango de representación y la precisión en los siguientes formatos:
a) Coma fija en signo y magnitud con 8 bits donde 3 son fraccionarios.
b) Coma fija en signo y magnitud con 8 bits donde 4 son fraccionarios.
c) Coma fija sin signo con 8 bits donde 3 son fraccionarios.
d) Coma fija sin signo con 8 bits donde 4 son fraccionarios.
41. Determinad la precisión necesaria para poder representar el número +0,1875(10 de
una manera exacta (sin error de representación) con un formato de coma fija en base 2.
42. Determinad las características de rango y precisión, y también el número de dígitos
enteros y fraccionarios necesarios en un formato de coma fija en signo y magnitud, para
poder representar de una manera exacta los números +31,875(10 y −16,21875(10.
43. Haced la suma y la resta de los pares de siguientes números, suponiendo que están
respresentados en signo y magnitud con 8 bits donde 3 son fraccionarios:
a) 00111000(2 y 10100000(2
b) 10111010(2 y 11101100(2
Verificad si el resultado es correcto
Representación de la información numérica
67
© FUOC • PID_00153515
Representación de la información numérica
2.5. Representación en coma flotante
El uso de la representación de números en notación científica está justificado
cuando debemos trabajar con números muy grandes o con números muy pe-
Podéis ver la representación de
números en notación científica
en el subapartado 1.7 de este módulo.
queños, y quizá de manera simultánea. La gran ventaja que ofrece es la posibilidad de representar números que, de otro modo, requerirían un número
elevado de dígitos para codificarlos.
La representación en notación científica también recibe el nombre de representación en coma flotante, en oposición al término coma fija, y de esta manera nos
a
referiremos a este tipo de representación de ahora en adelante.
A diferencia de la coma fija, donde la posición de la coma fraccionaria está fijada en el formato y siempre es la misma, en coma flotante la posición de la
coma se determina a partir del valor que toma el exponente. El número
+32,74(10 · 102 es equivalente al +327410, mientras que +32,74(10 · 10−1 es equivalente a +3,274(10. El valor del exponente indica la posición relativa de la
coma fraccionaria.
Los números en coma flotante toman la forma:
±R · be
Donde ‘+’ o ‘−’ indica el signo de la magnitud representada, R es un número fraccionario que recibe el nombre de mantisa, b es la base de numeración y e es un número entero que recibe el nombre de exponente.
Dentro de los computadores, los números representados en coma flotante toman la base 2 como base de numeración. Es el caso de −11,101(2 · 2101(2,
0,011(2 · 211(2 y −1110,001(2 · 2101(2. Observemos que tanto la mantisa como el
exponente están codificados en binario.
Para simplificar la notación, escribiremos los exponentes en base 10 aunque
se trate de una representación binaria. Es decir, no escribiremos +1,011(2 · 211(2,
a
sino +1,011(2 · 23.
En el trabajo manual, adaptamos dinámicamente el número de dígitos utilizados en la mantisa y el exponente de la representación en coma flotante.
Podemos utilizar +2,995 · 108 o +0,02995 · 1010, según convenga a nuestras
necesidades.
Para agilizar los cálculos dentro de los computadores, debemos ceder esta flexibilidad y adoptar restricciones que permitirán simplificar el procesamiento de este
Terminología
Se pueden utilizar los términos
notación científica o coma
flotante indistintamente para
designar este tipo de representación. En los apartados siguientes, sin embargo, se
utilizará la denominación
coma flotante.
68
© FUOC • PID_00153515
Representación de la información numérica
tipo de datos. Asumiremos que la base de numeración es 2 y que el número de
bits destinados a la mantisa y al exponente se fija en la especificación del formato.
Para la representación en coma flotante dentro de los computadores,
asumiremos que la base de numeración es 2 y que en la definición
Nota
Aunque la base de numeración
dentro de los computadores es
2, a lo largo del texto utilizaremos base 10 en algunos casos
para ejemplificar los conceptos
que presenten.
del formato se fijará el número de bits de la mantisa y el número de
bits del exponente.
La representación de un valor numérico en coma flotante no es única. Un
mismo número se puede escribir de distintas maneras. Algunas representa-
La representación de un valor
numérico en coma flotante
no es única.
ciones del número 26300(10 en coma flotante son: 2,63(10 · 104, 0,263(10 ·
105, 263(10 · 102, 2630(10 · 101, 26300(10 · 100 o 263000(10 · 10−1.
De nuevo, podemos conseguir mejoras en el procesamiento de los números en
coma flotante dentro de los computadores si restringimos esta flexibilidad. Eliminaremos la multiplicidad de representaciones si fijamos la posición de la
coma fraccionaria de la mantisa respecto del primer dígito no nulo.
Por ejemplo, el formato puede determinar que la coma está a la derecha del
primer dígito no nulo. Con esta limitación, el número 26300(10 tiene una representación única, que es 2,63 · 104.
Un tipo de operación que
se simplifica si fijamos la posición
de la coma de la mantisa es la
comparación de valores numéricos.
Para evitar la multiplicidad de representaciones de un mismo valor numérico propia de la representación en coma flotante, en la definición
del formato que hay que utilizar se fija la posición de la coma fraccionaria respecto del primer dígito no nulo.
Cuando la mantisa tiene fijada la posición de la coma fraccionaria, recibe el calificativo de mantisa normalizada.
Las posiciones más habituales a las que se fija la coma de la mantisa son la derecha del primer dígito no nulo y la izquierda del primer dígito no nulo. En
este curso, utilizaremos la primera alternativa: asumiremos que la coma de la
mantisa está a la derecha del primer dígito no nulo, excepto que se indique
a
explícitamente otro tipo de normalización.
Los valores numéricos representados en coma flotante con mantisa normalizada y coma a la derecha del primer bit no nulo son de la forma:
±1, x−1x−2 · · · · · x−k · be
donde xi son dígitos binarios (bits), b es la base de numeración y e es el
exponente.
Coma flotante con
mantisa normalizada
En las representaciones en
coma flotante con la coma de
la mantisa fijada a la izquierda
del primer dígito no nulo, los
números son de la forma:
±0,1x−2 ... x−k · be.
© FUOC • PID_00153515
69
Representación de la información numérica
Para la representación de números en coma flotante dentro de los computadores, se aprovechan las ventajas que comporta la asunción de las restricciones anteriores. La primera que se deriva de éstas es que no hay que almacenar
la base de numeración, porque se asume que es 2, tanto para la mantisa como
para el exponente.
La codificación en coma flotante debe incorporar la información de signo, el
valor de la mantisa y el del exponente. La figura siguiente muestra el orden en
el que es habitual disponer estos valores dentro del conjunto de dígitos dispo-
El orden de precedencia signoexponente-mantisa no es el único
posible, pero sí que es el orden más
utilizado.
nibles para la representación:
Como se ve en la figura, un bit se destina a la representación del signo. La codificación habitual del bit de signo es 0 para indicar signo positivo y 1 para
indicar signo negativo.
El valor del exponente en las representaciones en coma flotante suele estar restringido a los enteros. Para codificarlo, lo más habitual es utilizar una represen-
El tipo de representación
Aunque exceso a M sea la representación más habitual del
exponente, se puede utilizar
cualquier otro tipo de representación de números enteros,
como por ejemplo Ca2.
tación en exceso a M, donde M toma frecuentemente los valores 2q−1 o 2q−1 − 1,
en los que q es el número de bits disponibles para la codificación del exponente.
Las alternativas de representación de la mantisa y el exponente, y también las posibilidades de combinar signo, exponente y mantisa en la codificación final hacen
que el número de posibles representaciones en coma flotante sea muy amplio.
En este curso, si no se especifica otra cosa, utilizaremos representaciones en
coma flotante en las que el signo, el exponente y la mantisa los encontraremos
en este orden. Un 0 en el bit de signo indicará signo positivo, mientras que un
1 indicará signo negativo. El exponente estará codificado en exceso a M, con
M = 2q−1, donde q es el número de bits disponibles para la representación del
exponente y la mantisa será normalizada con la coma a la derecha del primer
bit no nulo.
a
En un formato de coma flotante de 8 bits con mantisa normalizada de 4 bits
y exponente en exceso a M, en el que M toma el valor 2q−1 y q es el número de
bits disponibles para la representación del exponente, la codificación del número −10,11(2 · 22 es la que se muestra en la figura siguiente:
Exceso a 4 porque...
... hay un total de 8 bits, de los
cuales 4 son para representar la
mantisa normalizada y 1 para
codificar el signo. Para el exponente quedan 3 bits. Si M toma
el valor 2q−1, M = 23−1 = 22 = 4.
El exponente se representa en
exceso a 4.
70
© FUOC • PID_00153515
Representación de la información numérica
La siguiente tabla muestra algunos números representados en este formato:
Números
S
e
R
−1,101(2 · 2−1
1
0
1
1
1
1
0
1
1,101(2 · 2−1
0
0
1
1
1
1
0
1
0,01(2 · 2−1
0
0
0
1
1
0
0
0
−110(2 · 2−1
1
1
0
1
1
1
0
0
A lo largo del texto, utilizaremos
las letras S, e y R para referirnos,
respectivamente, al signo, el
exponente y la mantisa.
En la tabla precedente podemos observar que el primer bit de la mantisa (columna R) siempre es 1. El motivo es el tipo de codificación que hemos elegido para
la mantisa. Las mantisas son de la forma 1,x−1x−2… Tienen una parte fija (1,) y
una parte variable (x−1x−2…). Para optimizar recursos, podemos almacenar sólo
la parte variable, ya que la parte fija es conocida y común a todos los números.
Esto permitirá almacenar 1 bit más para la mantisa, de manera que aumentará
la precisión, o bien utilizar un bit menos en la representación. Las mantisas almacenadas con esta técnica reciben el nombre de mantisas con bit implícito.
La técnica del bit implícito consiste en almacenar sólo la parte variable
de las mantisas normalizadas y asumir la parte fija como conocida y definida en el formato de la representación.
El uso del bit implícito permite almacenar mantisas 1 bit mayores, es decir, redu-
a
cir en 1 bit el número de bits necesarios para la representación de la mantisa.
Codificación de un número decimal en coma flotante normalizada y binaria
Para codificar el número +104(10 en un formato de coma flotante normalizada de 8 bits,
de los cuales 3 bits se destinan a la mantisa con bit implícito y exponente en exceso a M,
seguiremos el proceso siguiente:
1) Codificar el número +104(10 en base 2.
Si aplicamos el método de cambio de base basado en divisiones sucesivas, obtenemos
que 104(10 = 1101000(2.
2) Normalizar la mantisa de la forma 1,x−1x−2x−3…: 1101000(2 = 1,101 · 26.
El cambio de base
Para cambiar a base 2 el 104(10
hacemos divisiones sucesivas:
104 = 52 · 2 + 0
52 = 26 · 2 + 0
13 = 6 · 2 + 1
6 =3·2+0
3 =1·2+1
1 =0·2+1
104(10 = 1101000(2
3) Identificar el signo, el exponente y la mantisa.
a) El número es positivo; por lo tanto, el bit de signo será 0: S = 0.
b) La mantisa de este número es 1,101. El formato indica que trabajamos con una
mantisa de 3 bits y bit implícito. Por lo tanto, guardaremos los 3 bits a la derecha de
la coma: 101.
c) El exponente toma el valor 6.
4) Codificar en exceso a M el exponente. De los 8 bits del formato, 3 se utilizan para la
mantisa y 1 para el signo. Quedan 4 para el exponente. Por lo tanto, el valor del exceso
es 24−1 = 23 = 8. El 6(10 codificado en exceso a 8 es 6(10 + 8(10 = 14(10. Si aplicamos otra vez
el método de cambio de base basado en divisiones sucesivas, encontramos que el 14(10
en base 2 es el 1110(2. Por lo tanto, e = 1110.
5) Juntar las codificaciones de signo, exponente y mantisa en el orden de precedencia correcto (S – e − R) para obtener la representación final:
S
Exponente
0
1
1
1
Mantisa
0
1
0
1
Por lo tanto, la codificación del número +104(10 en el formato binario de coma flotante
especificado es 01110101.
El cambio de base
Para cambiar a base 2 el 14(10
hacemos divisiones sucesivas:
14 = 7 · 2 + 0
17 = 3 · 2 + 1
13 = 1 · 2 + 1
11 = 0 · 2 + 1
14(10 = 1110 (2
El subrayado destaca la posición del
exponente dentro de una cadena
de bits que codifica un número en
coma flotante.
71
© FUOC • PID_00153515
Descodificación de un número en coma flotante normalizada binaria
Para encontrar el valor decimal del número 01010101 que está en un formato de coma
flotante normalizada de 8 bits con 4 bits de mantisa con bit implícito y exponente en
exceso, seguiremos el proceso siguiente:
1) Identificar el signo.
Si asumimos que el formato mantiene signo, exponente y mantisa en este orden, el bit
del extremo izquierdo codifica el signo. En el 01010101 el primer bit es 0; por lo tanto,
el signo es positivo.
2) Identificar la mantisa.
Dado que la mantisa ocupa las cuatro posiciones más bajas, se trata de los bits 0101. Ahora bien, el formato indica la existencia del bit implícito. Por lo tanto, la mantisa es en
realidad 1,0101(2.
3) Identificar el exponente.
El exponente es determinado por los 3 bits que quedan:
S
Exponente
0
1
0
1
Mantisa
0
1
0
1
M toma el valor 2q−1, por lo cual M = 23−1 = 22 = 4. De este modo, el exponente codificado
es 101(2 − 4(10 = 5(10 − 4(10 = 1(10. El exponente e = 1(10.
4) Juntar signo, exponente y mantisa.
Signo positivo, mantisa 1,0101(2 y exponente 1(10: el número representado es el +1,0101 · 21.
5) Hacer un cambio de base para encontrar el valor decimal.
Si aplicamos el TFN, encontramos que:
+1,0101(2 · 21 = (1 · 20 + 0 · 2−1 + 1 · 2−2 + 0 · 2−3 + 1 · 2−4) · 21 = 21 + 2−2 · 21 + 2−4 · 21 =
+2,625(10
Por lo tanto, el número 01010101 codifica en el formato de coma flotante especificado
el valor decimal +2,625(10.
Para encontrar el número 10010001 que está en un formato de coma flotante normalizada de 8 bits con 5 bits de mantisa con bit implícito y exponente en exceso, seguiremos
el proceso siguiente:
1) Identificar el signo.
Si asumimos que el formato mantiene signo, exponente y mantisa en este orden, el bit
del extremo izquierdo codifica el signo. En el 10010001 el primer bit es 1; por lo tanto,
el signo es negativo.
2) Identificar la mantisa.
Dado que la mantisa ocupa las cinco posiciones más bajas, se trata de los bits 10001. El
formato indica la existencia de bit implícito. Por lo tanto, la mantisa es en realidad
1,10001(2.
3) Identificar el exponente.
El exponente es determinado por los 2 bits que quedan:
S
1
e
0
Mantisa
0
1
0
0
0
1
M toma el valor 2q−1, por lo cual M = 22−1 = 21 = 2. De este modo, el exponente codificado
es 00(2 − 2(10 = 0(10 − 2(10 = −2(10. El exponente e = −2(10.
4) Juntar signo, exponente y mantisa.
Signo negativo, mantisa 1,10001(2 y exponente −2(10: el número representado es el −
1,10001(2 · 2−2.
5) Hacer un cambio de base para encontrar el valor decimal.
Si aplicamos el TFN, encontramos que
−1,10001(2 · 2−2 = −(1 · 20 + 1 · 2−1 + 0 · 2−2 + 0 · 2−3 + 0 · 2−4 + 1 · 2−5) · 2−2 =
= −(2−2 + 2−1 · 2−2 + 2−5 · 2−2) = −0,3828125(10
Por lo tanto, el número 10010001 codifica en el formato de coma flotante especificado
el valor decimal −0,3828125(10.
Representación de la información numérica
72
© FUOC • PID_00153515
Representación de la información numérica
2.5.1. Rango de representación en coma flotante
La definición de rango de representación establece que es el menor intervalo que contiene todos los números representables en un sistema de representación numérica. Para conocer el rango de representación de un formato
en coma flotante, debemos encontrar el número mayor y el menor que podemos representar.
Los pasos que hay que seguir para la determinación del rango de una representación en coma flotante son:
1) Obtener el mayor valor del exponente.
2) Obtener el mayor valor de la mantisa.
3) Encontrar la mayor magnitud representable con la combinación de estos
valores.
El rango está delimitado por los valores positivo y negativo de esta magnitud.
La mayor magnitud que podemos representar en coma flotante es aquella que tiene el exponente mayor con la mantisa mayor. El rango de representación del
exponente, si asumimos que está codificado en exceso a M y M = 2q−1 donde
q es el número de bits disponibles para la representación del exponente, es
[−2q−1, 2q−1 − 1]. El valor máximo del exponente será, por lo tanto, 2q−1 − 1 = M − 1.
El valor máximo de la mantisa, que en este curso consideramos que está normalizada de la forma 1,x−1x−2…, es aquél en el que todos los bits (todos los
xi) son 1. Con k bits para la representación, la mantisa normalizada y bit imk+1
plícito, el valor máximo es de la forma 1, 11 ... 11. Hay k + 1 bits, porque
debemos incluir el bit implícito que no se almacena en la representación.
Para encontrar el valor de esta mantisa, calculamos:
1,11
k +1
11 = 111
k +1
(
11 · 2 − k = 2 k + 2 k −1 + 2 k − 2 +
⎛ 2 k +1 − 2 0 ⎞ − k
21 + 2 0 · 2 − k = ⎜
⎟· 2 =
⎝ 2 −1 ⎠
)
⎛ 2 k +1 − 1 ⎞ − k
1
k +1
−k
1
−k
=⎜
⎟ · 2 = 2 −1 · 2 = 2 − 2 = 2 − k
2
⎝ 1 ⎠
(
)
Por lo tanto, la mayor magnitud que podemos representar en el formato de
coma flotante descrito es:
1 ⎞ (2
⎛
⎜ 2 − 2k ⎟ · 2
⎝
⎠
q −1
)
−1
(
1⎞
2 M −1
⎛
= ⎜ 2 − k ⎟ · 2 M −1 = 2 · 2 M −1 − k = 2 M − 2 M − k −1 = 2 M · 1 − 2 −( k +1)
2 ⎠
2
⎝
)
Rango en exceso a M
El rango en exceso a M es
[−M, 2q−1−M ], donde q es
el número de bits disponibles.
Si M toma el valor 2q−1 queda
el rango siguiente:
[−2q−1, 2q − 1 − 2q−1] =
[−2q−1, 2q − 2q−1 − 1] =
[−2q−1, 2q−1 − 1] = [−M, M − 1]
73
© FUOC • PID_00153515
Representación de la información numérica
La mayor magnitud que podemos representar en un formato de coma
flotante de n bits, de los cuales k bits representan la mantisa normalizada de la forma 1,x−1x−2… (es decir, con la coma a la derecha del primer
bit a 1), con bit implícito y exponente de q bits en exceso a M, si asumimos que M toma el valor 2q−1 es:
1 ⎞ M −1 ⎛
1 ⎞ (2q−1 −1)
⎛
= ⎜2 − k ⎟ · 2
⎜2 − k ⎟ · 2
2 ⎠
2 ⎠
⎝
⎝
En las representaciones de coma flotante, el signo se representa con un bit
que lo codifica. Por este motivo, la cantidad de números positivos que se
pueden representar es exactamente igual a la de números negativos. Es un
sistema de representación totalmente simétrico. Por lo tanto, el rango está
determinado por los valores positivo y negativo de la mayor magnitud representable.
Por lo tanto, el rango de representación de un formato de coma flotante
de n bits, de los cuales k bits representan la mantisa normalizada de la
forma 1,x−1x−2… (es decir, con la coma a la derecha del primer bit a 1),
con bit implícito y exponente de q bits en exceso a M, si asumimos que
M toma el valor 2q−1 es:
⎡ ⎛
1 ⎞ M −1
⎢− ⎜ 2 − k ⎟ · 2 ,
2 ⎠
⎣ ⎝
⎡ ⎛
1 ⎞ (2q−1 −1)
,
= ⎢− ⎜ 2 − k ⎟ · 2
2 ⎠
⎣ ⎝
⎤
1⎞
⎛
+ ⎜ 2 − k ⎟ · 2 M −1 ⎥ =
2 ⎠
⎝
⎦
1 ⎞ (2q−1 −1) ⎤
⎛
+ ⎜2 − k ⎟ · 2
⎥
2 ⎠
⎝
⎦
El rango establece el intervalo que contiene los valores representables, pero
esto no quiere decir que se puedan representar todos los números contenidos
en el intervalo. De hecho, en el formato de coma flotante definido no se puede
representar el cero, ya que la menor mantisa que se puede representar es dife-
a
rente de cero, a causa del bit implícito, precisamente.
Por este motivo, el rango de representación de los formatos en coma flotante
se da como la unión de dos intervalos, uno que incluye todos los números negativos representables y otro que incluye todos los números positivos representables.
La menor magnitud que se puede representar en un formato de coma flotante
con bit implícito es la que tiene la mantisa de menor magnitud y el menor exponente. La menor mantisa es de la forma 1,0…0, y el menor exponente representable en exceso a M es −M.
El problema de la
representación del cero
El problema de la representación del cero se soluciona en
algunos formatos de coma flotante si reservamos una codificación determinada para
representarlo. Por ejemplo, en
el estándar IEEE754, cuando
los bits de exponente y mantisa son ceros se asume que se
trata del valor cero. De una
manera semejante, se reservan
otras codificaciones para representar valores que tienen un interés especial, como por
ejemplo +∞ y −∞.
74
© FUOC • PID_00153515
Representación de la información numérica
La menor magnitud que se puede representar en un formato de coma
flotante de n bits, de los cuales k bits representan la mantisa normalizada de la forma 1,x−1x−2… (es decir, con la coma a la derecha del primer
bit a 1), con bit implícito y exponente de q bits en exceso a M, si asumimos que M toma el valor 2q−1 es:
1,0 · 2−M = 2−M = 2−2
q−1
Por lo tanto, no se pueden representar números dentro del intervalo abierto
(
−2 2
−( q −1)
,
22
−( q −1)
)
, en donde se incluye el cero.
a
Sin embargo, esto nos permite ajustar el rango de representación como la
unión de dos intervalos, con lo cual se excluye el intervalo abierto de no re-
Intervalos abiertos
y cerrados
Un intervalo es abierto cuando
no incluye los valores numéricos que lo delimitan; cerrado,
cuando los incluye.
presentación que acabamos de definir.
El rango de representación de un formato de coma flotante de n bits, de
los cuales k bits representan la mantisa normalizada de la forma 1,x−1x−2 ···
(es decir, con la coma a la derecha del primer bit a 1), con bit implícito
y exponente de q bits en exceso a M, si asumimos que M toma el valor
2q−1 es:
⎡ ⎛
1 ⎞ M −1 − M ⎤ ⎡ − M ⎛
1 ⎞ M −1 ⎤
⎢ − ⎜ 2 − k ⎟ · 2 , 2 ⎥ ∪ ⎢ +2 , + ⎜ 2 − k ⎟ · 2 ⎥
2
2
⎠
⎝
⎠
⎣ ⎝
⎦ ⎣
⎦
Esta manera de especificar el rango muestra las magnitudes mayores y
menores que se pueden representar y pone de manifiesto que no se puede representar el cero.
Los parámetros que definen el formato de coma flotante, como por ejemplo
la existencia o no de bit implícito, la manera de normalizar la mantisa, el número de bits destinados al exponente y los destinados a la mantisa y el tipo
de codificación del exponente influyen directamente sobre el rango. En cada
caso, se debe hacer el cálculo de acuerdo con estos parámetros para determinarlo.
a
La ampliación del formato de coma flotante es una combinación de la ampliación de la representación del exponente y la representación de la mantisa. La
ampliación o extensión en coma flotante consiste en convertir los números representados en un formato con q bits para el exponente y k bits para la mantisa a un formato con p + q bits para el exponente y j + k bits para la mantisa.
Si consideramos que el exponente está en exceso a M, la ampliación de q a p + q
bits para el exponente sigue el procedimiento que ya hemos descrito.
Podéis ver la ampliación de los
números representados en exceso a M
en el subapartado 2.3.10 de este módulo.
75
© FUOC • PID_00153515
La extensión de una mantisa fraccionaria es sencilla. Convertir una mantisa
fraccionaria de k bits en una representación de j + k bits sólo comporta añadir
j ceros a la derecha. El bit de signo no cambia.
La ampliación de una codificación en coma flotante con q bits para el
exponente representado en exceso a M, y k bits para la mantisa fraccionaria, a un formato con p + q bits para el exponente y j + k bits para la
mantisa, se consigue si mantenemos el bit de signo inicial y hacemos la
extensión de la mantisa y del exponente.
La ampliación de una mantisa fraccionaria de k bits a una mantisa
fraccionaria de j + k bits se consigue si añadimos j ceros a la derecha de
la mantisa.
La ampliación de un exponente en exceso a M se consigue si aplicamos la extensión a p + q bits de un formato en exceso a M.
Extensión de un formato de coma flotante
Para extender la codificación 10100100 que representa un número en formato de coma
flotante de 8 bits, donde 4 bits son de mantisa fraccionaria y 3 bits de exponente en exceso a M, con M = 2q−1 donde q es el número de bits para el exponente, a un formato de
16 bits donde 7 son de mantisa y 8 de exponente en exceso a M con M = 2q−1y q el número
de bits del exponente, procederemos de la siguiente manera:
1) Identificar signo, mantisa y exponente de la codificación 10100100:
signo = 1
mantisa = 0100
exponente = 010
2) Extender la mantisa fraccionaria.
Pasar de 4 a 7 bits equivale a añadir tres ceros a la derecha:
0100 → 0100000
3) Ampliar el exponente.
El exponente de 3 bits hace que el exceso tome el valor M = 4 , ya que 2q−1 = 23−1 = 22 =
4. Al pasar a 8 bits, M toma el valor 128, ya que 2q−1 = 28−1 = 27 = 128.
La codificación de 3 bits 010 en exceso a 4 se extiende a una codificación de 8 bits en
exceso a 128 añadiendo cinco unos a la derecha del bit de más peso (es un número negativo, puesto que empieza por cero y la diferencia en número de bits es 5, 8 − 3 = 5).
010 → 01111110
4) Juntar la mantisa nueva y el exponente nuevo con el signo para obtener la codificación nueva:
1011111100100000
2.5.2. Precisión de una representación en coma flotante
La precisión de una representación es la distancia entre dos números representables. Si analizamos el número 0100101, que está en coma flotante de 8 bits,
mantisa normalizada y bit implícito y exponente de 4 bits, encontraremos que
es el +1,010(2 · 21. El número representable que lo sigue es aquel que obtene-
Representación de la información numérica
76
© FUOC • PID_00153515
mos si sumamos 1 al bit menos significativo de la mantisa, es decir, el +1,011(2
· 21. De una manera semejante, el número representable anterior al 1,010(2 ·
21 corresponde al que obtenemos si restamos 1 en el bit menos significativo
de la mantisa, es decir, el 1,001(2 · 21. Podemos ver que la distancia entre el
1,010(2 · 21 y el 1,011(2 · 21 es 0,001(2 · 21 y que la distancia entre el 1,010(2 · 21
y el 1,001(2 · 21 también es 0,001(2 · 21.
Consideremos ahora el número 01011010(2, que está codificado en el mismo formato. Si analizamos este número, encontraremos que se trata del +1,010(2 · 23. Si
seguimos el mismo procedimiento, podemos obtener el número siguiente y el
anterior, que corresponden, respectivamente, al 1,011(2 · 23 y el 1,001(2 · 23.
En este caso, la distancia entre los números es 0,001(2 · 23. La distancia que separa estos números es diferente de la que hemos encontrado anteriormente,
aunque se trata del mismo formato de coma flotante.
En las representaciones de coma flotante, la distancia que separa dos números
representables consecutivos depende de su magnitud.
a
El hecho de que la distancia sea distinta es a causa de la diferencia en el valor
del exponente. La distancia entre números consecutivos se mantiene si el exponente es el mismo.
La precisión de un formato de coma flotante de n bits, de los cuales k
bits representan la mantisa normalizada de la forma 1,x−1x−2… (es decir,
con la coma a la derecha del primer bit a 1), con bit implícito y exponente de q bits en exceso a M, si asumimos que M toma el valor 2q−1 es:
2−k · 2e
donde e es el valor del exponente del número representado.
El hecho de que la distancia entre un número representable y el siguiente dependa del número representado comporta que, a diferencia de lo que ocurre en la
coma fija, en coma flotante la distancia entre los números no es constante. Por lo
tanto, la distribución de los números representables en coma flotante sobre la recta de los reales no es uniforme. La figura siguiente muestra este hecho de una
manera esquemática:
Representación de la información numérica
77
© FUOC • PID_00153515
Representación de la información numérica
La figura muestra la distribución de los números representables con 5 bits en
coma fija y en coma flotante. Los números en coma fija (bajo) son de la forma
±x0,x−1x−2x−3 (1 bit por el signo y 4 por la magnitud con 3 bits fraccionarios) y
tienen una distribución uniforme. Los números en coma flotante (arriba) son
de la forma ±1,x−1x−2 · 2e (mantisa de 2 bits normalizada y con bit implícito y
exponente de 2 bits en exceso a M) y la distribución es simétrica respecto del
cero, pero no uniforme.
La cantidad de números representables es la misma en los dos formatos (salvo
el problema del doble cero de la coma fija). Las dos representaciones disponen
de 4 bits para representar la magnitud y 1 bit para representar el signo. Ahora
bien, la diferencia en la distribución hace que la representación de coma flotante tenga un rango mayor que la de coma fija. Además, la precisión en coma
flotante es mejor (los números son más cercanos) cuando los números representados son pequeños.
Error de representación en coma flotante
En los ejemplos de codificación que preceden, los números se pueden codificar
de una manera exacta, es decir, no es necesario hacer ningún tipo de aproxima-
Podéis ver las aproximaciones por
redondeo y por truncamiento en el
subapartado 2.1.4 de este módulo.
ción. Ahora bien, cuando la mantisa no cabe en los bits que en el formato se
destinan para representarla, la debemos aproximar a partir de uno de los dos
métodos presentados, redondeo o truncamiento, lo cual introduce un error de
representación: el número representado no es exactamente el que queríamos re-
a
presentar, sino un número cercano.
En este curso asumiremos que, por defecto, el método de aproximación aplicado a las mantisas es el truncamiento.
a
Codificación en coma flotante normalizada binaria de un número
en base 10 con aproximación
Para codificar el número −85,3(10 · 102 en un formato de coma flotante normalizada de
16 bits, de los cuales 7 bits son de mantisa, con bit implícito y exponente en exceso a M,
seguiremos el siguiente proceso:
1) Codificar el número −85,3(10 · 102 en base 2.
El número −85,3(10 · 102 lo podemos escribir como −8530(10. Si aplicamos el método de
cambio de base basado en divisiones sucesivas, obtenemos que −8530(10 = −
10000101010010(2.
2) Normalizar la mantisa de la forma 1,x−1x−2x−3…:
−10000101010010(2 = −1,0000101010010(2 · 213
3) Identificar el signo, el exponente y la mantisa.
a) El número es negativo; por lo tanto, el bit de signo será 1: S = 1.
b) La mantisa de este número es 1,0000101010010(2. El formato indica que trabajamos
con bit implícito. Por lo tanto, la mantisa que hay que almacenar debería ser
000010101001. Esta mantisa no cabe en los 7 bits disponibles en el formato y, de este
modo, la deberemos aproximar. Si utilizamos la técnica del truncamiento, los 7 bits que
almacenaremos son 0000101.
c) El exponente toma el valor 13.
Errores máximos
El error máximo del redondeo
es la mitad del error máximo
del truncamiento, pero computacionalmente es más costoso.
78
© FUOC • PID_00153515
Representación de la información numérica
4) Codificar en exceso a M el exponente.
De los 16 bits del formato, 7 se utilizan para la mantisa y 1, para el signo. Quedan 8 para
el exponente. Por lo tanto, si tomamos el exceso como 2q−1, el valor es 28−1 = 27 = 128. El
13(10 codificado en exceso a 128 es 13(10 + 128(10 = 141(10. Si aplicamos otra vez el método
de cambio de base basado en divisiones sucesivas, encontramos que el 141(10 en base 2
es el 10001101(2. Por lo tanto, e = 10001101.
5) Juntar las codificaciones del signo, exponente y mantisa en el orden de precedencia
correcto (S – e − R) para obtener la representación final:
S
1
Exponente
1
0
0
0
1
Mantisa
1
0
1
0
0
0
0
1
0
1
6) Analizar el error.
Hemos hecho un truncamiento de la mantisa donde hemos perdido los bits significativos
para la representación. Por lo tanto, el número representado no corresponde exactamente al número que queríamos representar. Para calcular el error cometido, debemos calcular la distancia entre el número que queríamos representar y el número que realmente
hemos representado. El número que hemos representado es: −1,0000101(2 · 213 = −8512(10
mientras que el número que queríamos representar es el −8530(10. Por lo tanto, el error
cometido es ⏐−8530(10 − (− 8512(10)⏐ = 28(10.
Para encontrar el valor decimal
representado por −1,0000101(2 · 213
debemos hacer un cambio de base
aplicando el TFN.
Por lo tanto, la codificación del número −85,3(10 · 102 en el formato binario de coma flotante especificado es 1100011010000101 y el error cometido en la representación es 28(10.
Desbordamiento en coma flotante
Los números fuera del rango de representación no son representables. Como
ejemplo, intentamos codificar el número +2345(10 en un formato de coma flotante de 8 bits, con mantisa normalizada de 3 bits y exponente de 4 bits en exceso a 8:
1) Codificamos el número 2345(10 en base 2.
Si aplicamos el método de cambio de base basado en divisiones sucesivas, obtenemos que 2345(10 = 100100101001(2.
2) Normalizamos la mantisa de la forma 1,x−1x−2x−3…:
100100101001(2 = 1,00100101001(2 · 211.
3) Identificamos el signo, el exponente y la mantisa.
a) El número es positivo; por lo tanto, el bit de signo será 0: S = 0.
b) La mantisa de este número es 1,00100101001. El formato indica que traba-
jamos con una mantisa de 3 bits y bit implícito. Truncaremos la mantisa en
los 3 bits que podemos almacenar, de manera que nos queda 001.
c) El exponente toma el valor 11(10.
4) Codificamos en exceso a 8 el exponente:
El 11(10 codificado en exceso a 8 es 11(10 + 8(10 = 19(10. Si volvemos a aplicar el
método de cambio de base basado en divisiones sucesivas, encontramos que
el 19(10 en base 2 es el 10011(2. Por lo tanto, e = 10011.
Cambio de base
Para pasar a base 2 el 2345(10
hacemos divisiones sucesivas:
2345 = 1172 · 2 + 1
1172 = 586 · 2 + 0
1586 = 293 · 2 + 0
1293 = 146 · 2 + 1
1146 = 73 · 2 + 1
1173 = 36 · 2 + 0
1136 = 18 · 2 + 0
1118 =
9·2+0
1119 =
4·2+1
1114 =
2·2+0
1112 =
1·2+0
1111 =
0·2+1
2345(10 = 100100111001 (2
Cambio de base
Para cambiar a base 2 el 19(10
hacemos divisiones sucesivas:
19 = 9 · 2 + 1
19 = 4 · 2 + 1
14 = 2 · 2 + 0
12 = 1 · 2 + 0
11 = 0 · 2 + 1
19(10 = 1110 (2
79
© FUOC • PID_00153515
Representación de la información numérica
El exponente e = 10011 no se puede representar con los 4 bits disponibles. Por
lo tanto, el número +2345(10 no se puede representar en el formato especificado
ya que el exponente necesario está fuera del rango de representación del exponente. Este fenómeno recibe el nombre de desbordamiento del exponente.
El desbordamiento del exponente se da cuando el exponente necesario para codificar un número en un formato de coma flotante supera el
mayor valor representable por el exponente.
Un fenómeno semejante se da cuando el exponente es demasiado pequeño. Intentemos codificar el número +0,00244140625(10 en un formato de coma flotante
de 8 bits, con mantisa normalizada de 3 bits y exponente de 4 bits en exceso a 8:
1) Codificamos el número +0,00244140625(10 en base 2.
Aplicamos el método de cambio de base basado en divisiones sucesivas y obtenemos que 0,00244140625 (10 = 0,00000000101(2.
2) Normalizamos la mantisa de la forma 1,x−1x−2x−3…:
0,00000000101(2 = 1,01(2 · 2−9
3) Identificamos el signo, el exponente y la mantisa.
a) El número es positivo; por lo tanto, el bit de signo será 0: S = 0.
b) La mantisa de este número es 1,01. El formato indica que trabajamos con
una mantisa de 3 bits con bit implícito. Por lo tanto, nos queda 010.
c) El exponente toma el valor −9.
4) Codificamos en exceso a 8 el exponente:
El −9(10 codificado en exceso a 8 es −9 (10 + 8(10 = −1(10. Este número es negativo
y, por lo tanto, está fuera del rango de representación en exceso a 8 empleado
en o por el exponente.
La codificación −1(10 para el exponente en exceso a 8 no es válida. Obtenemos
esta codificación porque el valor del exponente es demasiado pequeño para
poder ser representado en exceso a 8. Este fenómeno recibe el nombre de desbordamiento a cero del exponente.
El desbordamiento a cero del exponente se da cuando el exponente
necesario para codificar un número en un formato de coma flotante es
inferior al menor valor representable por el exponente.
Cambio de base
Para pasar a base 2 el
0,00244140625 (10 hacemos
multiplicaciones sucesivas:
0,00244140625 · 2 =
= 0,0048828125 + 0
0,0048828125 · 2 =
= 0,009765625 + 0
0,009765625 · 2 =
= 0,01953125 + 0
0,01953125 · 2 =
= 0,0390625 + 0
0,0390625 · 2 = 0,078125 + 0
0,078125 · 2 = 0,15625 + 0
0,15625
· 2 = 0,3125 + 0
0,3125
· 2 = 0,625 + 0
0,625
· 2 = 0,25 + 1
0,25
· 2 = 0,5 + 0
0,5
·2=0+1
0,00244140625 (10 =
= 0,00000000101(2
80
© FUOC • PID_00153515
2.5.3. Suma en coma flotante
La suma directa de los números en coma flotante +1,34(10 · 101 y +45,2(10 · 10−3
es complicada. La dificultad reside en el hecho de que no sabemos qué dígitos
debemos sumar. Para facilitar la tarea, hay que llevar a cabo una operación previa que consiste en igualar los exponentes.
En este sentido, cambiamos la representación del número menor de manera
que el exponente coincida con el exponente del número mayor. De este modo, podremos hacer la suma sin dificultades.
En el caso de los números +1,34(10 · 101 y +45,2(10 · 10−3, transformaremos la
representación del +45,2(10 · 10−3 para que el exponente sea 1:
+45,2(10 · 10−3 = 0,00452(10 · 101
A continuación, podremos hacer la operación de suma:
+
1 , 3 4 0 0 0
(10
· 101
0 , 0 0 4 5 2
(10
· 101
1 , 3 4 4 5 2
(10
· 101
← resultado
Finalmente, deberemos ajustar el exponente para conseguir colocar la coma
en la posición deseada. Por ejemplo, 13,4452(10 · 100.
Suma de dos números codificados en una representación de coma flotante
normalizada y binaria
Para sumar los números 01010101 y 00011001 que están en un formato de coma flotante
de 8 bits con 3 bits para la mantisa normalizada y con bit implícito, procederemos de la
manera siguiente:
1) Descodificar los números.
Si seguimos el procedimiento de descodificación, encontraremos que en este formato de coma
flotante el 01010101 represnta el +1,0101(2 · 21 y el 00011001 represnta el +1,1001(2 · 2−3.
2) Igualar exponentes.
Cambiamos la representación del número menor (el +1,1001(2 · 2−3) para que tenga el
mismo exponente que el número grande (que es 21): +1,1001(2 · 2−3 = 0,00011001(2 · 21.
3) Sumar las mantisas.
← transportes
1
0 ,
0
0
0 1 1 0 0 1
(2
· 21
+ 1 ,
0
1
0 1 0 0 0 0
(2
· 21
1 ,
0
1
1 0 1 0 0 1
(2
· 21
← resultado
El resultado de la suma tiene más bits que los disponibles en la representación. Esto hace
que este resultado no se pueda almacenar de manera exacta. Por este motivo, será necesario aproximar el resultado. Si trabajamos con truncamiento, el resultado de la suma se
Representación de la información numérica
81
© FUOC • PID_00153515
Representación de la información numérica
almacenará como 1,0110(2 · 21. La codificación de este número en el formato especificado
es 00010110(2.
Es habitual que el resultado de las operaciones entre números en coma
flotante no se pueda representar de manera exacta. Esto hace que se introduzca un error de representación cada vez que se lleva a cabo una
operación aritmética. El error que se introduce aquí es menor que la precisión de la representación.
El ejemplo anterior muestra la operación de suma de números en coma flotante. La operación de resta sigue las mismas pautas en lo que respecta a la necesidad de igualar los exponentes para llevar a cabo la operación.
a
Representaciones estandarizadas en coma flotante
En las representaciones de coma flotante no hay ninguna manera natural de
elegir el tamaño de los diferentes elementos (exponente y mantisa). Podríamos elegir cualquier manera de hacerlo. El hecho de elegir una representación
El uso de representaciones
estándares favorece el intercambio
de información entre organismos
distintos.
que nos guste implica que la representación se adaptará mejor a los números
reales con los que nos interesa trabajar. En contrapartida, dificulta notablemente el intercambio de información entre diferentes representaciones y, en
definitiva, entre diferentes personas y organizaciones. Por este motivo, generalmente se utilizan representaciones estándares, es decir, con número de bits
para el exponente y para la mantisa predeterminados.
La representación de coma flotante más extendida es la definida por la norma
IEEE754 del IEEE. Esta norma define dos representaciones de coma flotante
con mantisa normalizada (de la forma 1,x−1…x−k) y bit implícito, que son utilizadas en la mayoría de los computadores de la actualidad. Estas representaciones son las que se presentan en la siguiente tabla:
Nombre
Bits
Bits exponente
Exceso exponente
Single
(precisión sencilla)
32
8
127
Double
(precisión doble)
64
11
1023
Estas representaciones se recogen directamente en los principales lenguajes de
programación. De esta manera, en el lenguaje C la representación de precisión
sencilla recibe el nombre de float, mientras que la representación doble recibe
el nombre de double.
IEEE
El IEEE (Institute of Electrical and
Electronic Engineers) es una organización profesional de origen
norteamericano dedicada, entre
otras cosas, a definir y formalizar
estándares industriales.
Otras representaciones
Hay otras representaciones definidas por el IEEE en las que se
utiliza un número mayor de
bits. Son las denominadas representaciones de precisión extendida.
Además de definir los formatos, la norma define también distintas cuestiones
de carácter práctico, como por ejemplo los procedimientos para llevar a cabo las
operaciones (suma, resta, redondeo, truncamiento, etc.) y los mecanismos de
detección de problemas (desbordamiento, desbordamiento a cero del exponen-
Las representaciones estándares
incluyen mecanismos para
representar números especiales.
82
© FUOC • PID_00153515
Representación de la información numérica
te, etc.). También define una cuestión muy relevante, como son los mecanismos
de representación de algunos números especiales. Dos de estos números especiales son el cero y el infinito. Si analizamos cuidadosamente una representación de coma flotante normalizada, como por ejemplo la de precisión sencilla,
el número con menor valor absoluto que se puede representar es aquel que tiene
la menor mantisa y el exponente más negativo, es decir, el:
1,00…00(2 · 2−127
Por lo tanto, no es posible representar el cero directamente. El cero es un número que tiene una relevancia especial, por lo cual conviene buscar alguna
manera de representarlo. Por convenio, se ha decidido que el menor número
que se puede representar hará el papel del cero. Si analizamos cuál es la forma
que presenta este número en forma binaria, se observa que es (en el caso de
una representación de precisión sencilla) la siguiente:
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
Está compuesto únicamente por ceros y es una representación lo bastante natural para el número 0. Hay que tener en cuenta que el cero tiene una representación doble. La codificación
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
0
que corresponde al cero con signo negativo también representa al cero.
Otro símbolo un poco especial es el infinito. No se trata de un número estrictamente, pero se obtiene como resultado de algunas operaciones, como por
ejemplo:
∞=
1
0
La norma ha elegido como representación de este símbolo la siguiente codificación:
0
1
1
1
1
1
1
1
1
0
0
0
0
0
0
0
0
0
0
0
0
0
0
es decir, el máximo exponente y la mínima mantisa.
La gestión de estos casos especiales y de todos los fenómenos numéricos que
pueden ocurrir durante las diferentes operaciones implica la construcción de
hardware y algoritmos especiales capaces de gestionarlos. Este tipo de hardware presenta, en general, una complejidad mucho más elevada que la exis-
© FUOC • PID_00153515
83
tente en el hardware construido para gestionar las representaciones de coma
fija.
Actividades
44. Encontrad el valor decimal que codifican las cadenas de bits siguientes, interpretando
que se trata de números en un formato de coma flotante de 8 bits con mantisa normalizada de la forma 1,X y con bit implícito:
a) 11110010, donde la mantisa es de 4 bits.
b) 01010011, donde la mantisa es de 3 bits.
45. Haced las siguientes codificaciones:
a) El número −1,335(10 en coma flotante de 8 bits, mantisa de 3 bits normalizada de la
forma 1,X y con bit implícito. Haced una aproximación por truncamiento.
b) Repetid el apartado anterior, pero con una aproximación por redondeo.
c) El número 10,0327(10 en coma flotante de 9 bits, mantisa de 3 bits normalizada de la
forma 1,X y con bit implícito. Haced una aproximación por truncamiento.
d) Repetid el apartado anterior, pero con una aproximación por redondeo.
e) El número −2(10 · 103 en coma flotante de 8 bits, mantisa de 4 bits normalizada de la
forma 1,X y con bit implícito. Haced una aproximación por redondeo.
f) El número 10(10 · 105 en coma flotante de 8 bits, mantisa de 3 bits normalizada de la
forma 1,X y con bit implícito. Haced una aproximación por redondeo.
g) El número 2(10 · 10−6(10 en coma flotante de 8 bits, mantisa de 4 bits normalizada de
la forma 1,X y con bit implícito. Haced una aproximación por truncamiento.
h) El número −0,0001233(10 en coma flotante de 8 bits, mantisa de 3 bits normalizada de
la forma 1,X y con bit implícito. Haced una aproximación por truncamiento.
46. Encontrad la precisión y el error de representación para cada uno de los apartados de
la actividad 45.
47. Determinad el mayor número representable en los siguientes formatos:
a) Coma flotante de 16 bits, con mantisa normalizada de la forma 1,X, bit implícito y 5
bits para el exponente.
b) Coma flotante de 10 bits, con mantisa normalizada de la forma 1,X, bit implícito y 6
bits para el exponente.
48. Determinad si el número 2,89(10 · 1010 es representable en un formato de coma flotante de 16 bits, con mantisa normalizada de la forma 1,X, bit implícito y 5 bits para el
exponente.
49. Determinad si el número −1256(10 · 102 es representable en un formato de coma flotante de 10 bits, con mantisa normalizada de la forma 1,X, bit implícito y 6 bits para el
exponente.
50. Determinad el rango de representación en dos intervalos (rango de los positivos más
rango de los negativos) de los siguientes formatos:
a) Coma flotante de 16 bits, con mantisa normalizada de la forma 1,X, bit implícito y 5
bits para el exponente.
b) Coma flotante de 10 bits, con mantisa normalizada de la forma 1,X, bit implícito y 6
bits para el exponente.
51. Haced las siguientes sumas. Considerad que los números están en formato de coma
flotante de 8 bits, con mantisa normalizada de la forma 1,X, bit implícito y 5 bits para el
exponente:
a) 00110010 + 00110101
b) 10100101 + 10100100
c) 11110010 + 10111011
Representación de la información numérica
84
© FUOC • PID_00153515
Representación de la información numérica
3. Otros tipos de representaciones
En los apartados precedentes se exponen diferentes sistemas para representar
valores numéricos. Cada uno de estos sistemas tiene ventajas e inconvenientes,
y hay que seleccionar el sistema de representación adecuado para cada caso.
Todos los sistemas presentados están dirigidos a la representación de valores
numéricos. Ahora bien, dentro de los computadores, éste no es el único tipo
de información con el que se trabaja. En los apartados siguientes, se presentan
algunos tipos de representación con utilidades distintas de la representación
de valores numéricos o alfanuméricos.
3.1. Empaquetamiento de la información
Compartir, anotar o analizar información de números codificados en algún
tipo de formato binario es habitual cuando se trabaja en aplicaciones relacionadas con los computadores. Por ejemplo, en coma flotante normalizada de
16 bits, con 7 bits de mantisa y bit implícito, el número 0,169921875(10 se codifica de la manera siguiente:
0011111010101110
Dentro de los computadores, procesar una cadena de 16 bits como ésta no presenta dificultades. Ahora bien, trabajarla manualmente es complicado y hace
es cometer errores. El simple hecho de memorizarla pone de manifiesto estas
dificultades.
Para trabajar con este tipo de datos, sería muy conveniente encontrar formas
más compactas de escribirlos. Una manera sencilla de conseguir una representación más compacta de esta información es condensar la tira de bits en dígitos
hexadecimales. Recordemos la relación que hay entre base 2 y base 16 (16 = 24) y
la manera directa de cambiar entre estas bases.
Para compactar esta cadena de bits, la dividiremos en grupos de 4 bits. Cada
grupo se puede codificar directamente como un dígito hexadecimal. La cadena de dígitos hexadecimales es un número natural en base 16. En la figura siguiente, se muestra el procedimiento:
Los cambios de base entre estas
codificaciones se explican en el
subapartado 1.3.3 de este módulo.
85
© FUOC • PID_00153515
Representación de la información numérica
Habitualmente, se coloca el símbolo h al final de la cadena de dígitos para indicar que son dígitos hexadecimales.
a
Esta manera de compactar información binaria en cadenas de dígitos hexadecimales se denomina empaquetamiento hexadecimal.
El empaquetamiento hexadecimal consiste en compactar información binaria en cadenas de dígitos hexadecimales y permite tener una
representación más compacta de la información.
El empaquetamiento hexadecimal es muy utilizado en diferentes ámbitos relacionados con los computadores para facilitar el trabajo con números, instrucciones y direcciones de memoria. Este tipo de empaquetamiento se utiliza
sobre cadenas de bits, independientemente del sentido que tengan los bits
dentro de la cadena.
a
Empaquetamiento de una cadena de bits
Para empaquetar la cadena de bits 010100100011, procederemos de la manera siguiente:
1) Dividir la cadena en grupos de 4 bits: 0101 − 0010 − 0011.
2) Codificar cada grupo como un dígito hexadecimal: 5 − 2 − 3.
La cadena de dígitos hexadecimales que resulta es 523h. Si empaquetamos en hexadecimal la cadena de bits 010100100011, se obtiene la codificación hexadecimal 523h.
El proceso de empaquetamiento en hexadecimal es reversible. Se puede conocer la cadena de bits empaquetada en dígitos hexadecimales si convertimos
cada dígito hexadecimal en un grupo de 4 bits, tal y como se describe en el
subapartado 1.3.3.
Desempaquetamiento
Para desempaquetar la cadena 3ACh seguiremos el siguiente procedimiento:
1) Convertir cada dígito hexadecimal en un grupo de 4 bits:
3(16 = 0011(2
A(16 = 1010(2
C(16 = 1100(2
2) Juntamos los grupos de 4 bits en una única cadena de bits, y conservamos el orden de
precedencia de los dígitos hexadecimales, con lo cual obtenemos: 0011 1010 1100.
La cadena 3ACh de dígitos hexadecimales empaqueta la cadena de bits 001110101100.
El proceso de desempaquetamiento nos devuelve la cadena de bits que se
había empaquetado, pero no nos da información sobre su sentido. Sólo podemos interpretar una cadena de bits si conocemos su formato de representación.
a
Cada dígito hexadecimal da lugar
a 4 bits. De este modo, el dígito
hexadecimal 4 genera el grupo
de 4 bits 0100 y no el 100.
86
© FUOC • PID_00153515
Según la clave de interpretación, la misma cadena de bits codifica informaciones distintas. Por ejemplo, la cadena de bits 001110101100 puede tener diferentes interpretaciones:
1) Si se trata de un número natural, sabremos, si aplicamos el TFN, que:
001110101100(2 = 940(10
2) Si se trata de un número fraccionario en coma fija de 6 bits fraccionarios
sabremos, si aplicamos el TFN, que:
001110,101100(2 = 14,6875(10
3) Si se trata de un número en coma flotante normalizada donde hay 4 bits
para codificar el exponente y con bit implícito, sabremos que:
a) El primer bit codifica el signo. Por lo tanto, se trata de un número positivo.
b) Los 4 bits siguientes (0111) codifican el exponente. El 0111(2 es el 7(10. Si
asumimos que está en exceso a 23, el exponente es 7(10 − 23 (10 = −1(10.
c) El resto de los bits 0101100 codifican la mantisa normalizada. En este for-
mato, la mantisa es 1,0101100(2, que en decimal es 1,34375(10.
Con todo esto, podemos concluir que el número codificado por la cadena de
bits 001110101100 es:
1,34375(10 · 2−1 = 0,671875(10
3.2. Representación de la información alfanumérica
La representación alfanumérica se utiliza para describir información no numérica. La función principal es la representación de la información textual, que
incluye letras, cifras y símbolos que agrupamos genéricamente con el nombre
de caracteres.
A la hora de establecer una correspondencia entre el carácter y una codificación, hay que utilizar criterios que faciliten el tratamiento de los datos, como
por ejemplo la asignación de códigos en orden creciente a las letras del alfabeto para permitir una ordenación alfabética fácil.
El número de caracteres que hay que representar puede ser relativamente grande si consideramos el conjunto de símbolos que usamos de manera habitual:
mayúsculas, minúsculas, vocales acentuadas, símbolos de puntuación y matemáticos, etc.
Representación de la información numérica
87
© FUOC • PID_00153515
Representación de la información numérica
La codificación más extendida es el código ASCII. Este código tiene una versión básica de 128 símbolos que forma el estándar de facto que utilizan la mayoría de los computadores, y una versión extendida, no tan estandarizada, que
incluye 128 símbolos más. En la versión extendida, se utilizan 8 bits para codificar los 256 símbolos que incluye.
En la tabla siguiente, podemos ver la asignación del código ASCII. La representación numérica asociada a cada símbolo se obtiene a partir de sus coordena-
ASCII es la sigla de la expresión
inglesa American standard code for
information interchange.
das. El índice de columna es el dígito decimal menos significativo, y el de fila,
el más significativo. Por ejemplo, el carácter alfanumérico 3 se representa por el
valor decimal 51(10 (5u, d1), que es en binario el 00110011(2.
u
d0
d1
d2
d3
d4
d5
d6
d7
d8
d9
0u
NULL
SOH
STX
ETX
EOT
ENQ
ACK
BEL
BS
HT
1u
LF
VT
FF
CR
SO
SI
DLE
DC1
DC2
DC3
2u
DC4
NAK
SYN
ETB
CAN
EM
SUB
ESC
FS
GS
3u
RS
US
SP
!
“
#
$
%
&
‘
4u
(
)
*
+
,
-
.
/
0
1
5u
2
3
4
5
6
7
8
9
:
;
6u
<
=
>
?
@
A
B
C
D
E
7u
F
G
H
I
J
K
L
M
N
O
8u
P
Q
R
S
T
U
V
W
X
Y
9u
Z
[
\
]
^
_
`
a
b
c
10u
d
e
f
g
h
i
j
k
l
m
11u
n
o
p
q
r
s
t
u
v
w
12u
x
y
z
{
|
}
~
DEL
d
Los primeros 31 códigos y el último no corresponden a símbolos del lenguaje
o caracteres visualizables (el carácter 32 –identificado como SP– representa el
espacio en blanco). Estos códigos son caracteres de control utilizados para dar
formato al texto o como comandos para los dispositivos periféricos (terminales alfanuméricos o gráficos, impresoras, etc.).
Carácteres de control
no visualizables
Algunos caracteres de control
no visualizables son: DEL (borrar), ESC (escapada), HT (tabulador horizontal), LF (final
de línea), CR (retorno a primera columna), FF (final de página), STX (inicio de texto) o ETX
(final de texto).
Como consecuencia del incremento del uso de la informática y de la portabilidad e interoperabilidad de los computadores para trabajar con distintas lenguas
simultáneamente, es cada vez más popular la extensión de la representación
ASCII de los caracteres alfanuméricos a 2 bytes, que utiliza el estándar denominado Unicode y que incluye los alfabetos del resto de los idiomas y grafías más
importantes. Hay que tener en cuenta esta propiedad a la hora de elaborar textos que deban ser utilizables globalmente, por ejemplo en Internet, ya que en
caso de utilizar versiones de un byte, se pueden ver alteradas sus características
particulares (acentos, etc.).
El formato Unicode
El formato Unicode es estandarizado por la ISO/IEC,
(Organización Internacional
de Normalización / Comisión
Electrotécnica Internacional o
en inglés, International Organization for Standardization /
International Electrotechnical
Commission) con el identificador 10646.
88
© FUOC • PID_00153515
Los códigos ASCII correspondientes a los símbolos escritos (no a los caracteres
de control) se pueden construir fácilmente si añadimos 00h a la izquierda de
los códigos actuales expresados con 8 bits.
Las operaciones sobre caracteres se efectúan sobre agrupaciones de éstos
que se denominan cadenas de caracteres.
Operación sobre cadenas de caracteres ASCII
Queremos expresar la operación binaria que hay que hacer sobre un código ASCII para
convertir una letra en mayúsculas en el equivalente en minúsculas.
De entrada, vemos que los códigos consecutivos a partir del código 65 siguen el orden
de las letras del alfabeto inglés tanto para las mayúsculas como, a partir del código 97,
para las minúsculas. Por lo tanto, la distancia entre símbolos de mayúsculas y minúsculas
es constante.
Fijémonos, por ejemplo, en las dos versiones de la primera letra del alfabeto. El carácter A tiene el código 65, mientras que el de a es 97. La diferencia es de 32(10, que en binario y 8 bits
es 00100000. Por lo tanto, para transformar el código ASCII de una letra en mayúscula al
correspondiente código ASCII de la misma letra en minúscula, deberemos restar 32(10, o lo
que es lo mismo, tenemos que restar 00100000(2 al código ASCII en binario.
3.3. Representación BCD
Nuestra aritmética cotidiana se desarrolla en base 10. De este modo, solemos
trabajar con números de la forma 104(10, 745(10 o 214(10. En diferentes apartados de este módulo, se describen maneras de representar estos números en
base 2. No se contempla en los sistemas que se presentan, sin embargo, la posibilidad de mantener la estructura de esta representación; es decir, representar directamente los dígitos de la codificación decimal. Esta codificación debe
ser en binario, ya que dentro de los computadores sólo se utiliza la base 2.
Los dígitos decimales son 10, del 0 al 9. Para representar en binario estos diez dígitos, se necesitan 4 bits. La siguiente tabla muestra la codificación para los dígitos
decimales en binario.
Dígito decimal
Codificación binaria
0
0000
1
0001
2
0010
3
0011
4
0100
5
0101
6
0110
7
0111
8
1000
9
1001
Representación de la información numérica
El estándar Unicode
El almacenamiento de textos
con formato Unicode está presente en muchos de los procesadores de textos actuales
como, por ejemplo, Wordpad
de Windows.
89
© FUOC • PID_00153515
La siguiente figura muestra la manera en la que podemos representar un número decimal si codificamos cada dígito de manera individual:
La codificación binaria dígito a dígito de los números decimales aprovecha
parcialmente la capacidad de representación. El código 1100, por ejemplo, no
se utiliza. De las dieciséis combinaciones posibles que se pueden hacer con 4
bits, sólo se utilizan diez. Consiguientemente, son necesarios más bits para representar un mismo número que si utilizáramos una representación binaria.
La conversión a este tipo de representación es habitual en dispositivos de salida que tienen que servir para visualizar datos.
La codificación binaria dígito a dígito de los números decimales se conoce con
la sigla BCD (binary coded decimal).
a
La representación BCD consiste en codificar en binario los dígitos decimales de una representación de manera individual.
El hecho de que los dígitos estén codificados en binario individualmente no
cambia el hecho de que se trata de números decimales. Las operaciones de suma
y resta se desarrollarán como en el caso de base 10. De hecho, lo único que se
está haciendo en esta forma de representación es cambiar el símbolo que usamos para designar un dígito decimal por un código binario que tiene la misma
función. Se puede entender como un cambio de la simbología para representar
los dígitos.
Actividades
52. Empaquetad en hexadecimal el número natural 10110001(2.
53. Empaquetad en hexadecimal el número 0100000111111010(2 que está en un formato
de coma flotante normalizada de 16 bits, de los cuales 6 son de exponente y con bit implícito.
54. Codificad el número 1,125(10 en una representación binaria de coma fija sin signo de
12 bits de los cuales 8 bits son fraccionarios, y después empaquetadlo en hexadecimal.
55. Desempaquetad la cadena de bits A83h e interpretadla sabiendo que es un número
natural.
56. Desempaquetad la cadena de bits A83h e interpretadla sabiendo que es un número
de coma flotante normalizada de 12 bits y 4 bits para el exponente.
57. Desempaquetad la cadena de bits B5h e interpretadla sabiendo que es un número entero codificado en exceso a 10.
Representación de la información numérica
© FUOC • PID_00153515
90
58. Codificad en BCD el número 125(10.
59. Codificad en BCD el número 637(10.
60. Indicad qué número codifica la siguiente representación BCD: 00010011100.
61. Codificad el número 427(10 en BCD y en binario. Comparad el número de bits necesario en los dos casos.
Representación de la información numérica
© FUOC • PID_00153515
91
Resumen
En este módulo, se presenta un análisis de los sistemas de numeración posicionales y se exponen las maneras de representar valores numéricos que es habitual utilizar dentro de los computadores. Los puntos principales que se
tratan en este módulo son:
• El TFN y los algoritmos de divisiones sucesivas y de multiplicaciones sucesivas que permiten cambiar entre bases distintas la representación de un
valor numérico.
• La representación de números naturales con representaciones posicionales
utilizando base 2 (binario), base 16 (hexadecimal) y base 10 (decimal), y
también las operaciones de suma y resta de números naturales.
• Las limitaciones derivadas de los condicionamientos físicos de los computadores y las características que presentan los distintos formatos de representación (rango y precisión), y también el fenómeno de desbordamiento
y las técnicas de aproximación.
• La codificación de los números enteros a partir de las representaciones en
complemento a 2, signo y magnitud y exceso a M, y las operaciones de
suma y resta en cada una de estas codificaciones.
• La codificación de números fraccionarios con y sin signo en coma fija.
• La codificación de números en coma flotante.
•
El empaquetamiento de información en hexadecimal y la codificación
en BCD.
Representación de la información numérica
© FUOC • PID_00153515
92
Representación de la información numérica
© FUOC • PID_00153515
93
Ejercicios de autoevaluación
1. Codificad en complemento a 2, signo y magnitud y exceso a 128 el número −10(10 utilizando 8 bits.
2. Determinad el valor decimal que codifica la cadena de bits 00100100 en los siguientes
supuestos:
a) Si se trata de un número codificado en complemento a 2.
b) Si se trata de un número codificado en signo y magnitud.
c) Si se trata de un número codificado en exceso a 128(10.
3. Sumad en binario los números 111010101100(2 y 11100010010(2. Analizad el resultado
obtenido.
4. Codificad en un formato de coma fija de 8 bits donde 3 son fraccionarios y signo y magnitud el número +12,346(10. Si es necesario, utilizad una aproximación por truncamiento.
5. Codificad en un formato de coma flotante de 8 bits con mantisa de 3 bits normalizada
de la forma 1,X con bit implícito, y exponente en exceso a M con M = 2q−1 (donde q es el número de bits del exponente), el número +12,346(10. Si es necesario, usad una aproximación
por truncamiento.
6. Codificad en una representación BCD el número 178(10.
7. Determinad el valor decimal que representa el código 378h, sabiendo que se trata de un
número en coma flotante de 12 bits con mantisa de 4 bits normalizada de la forma 1,X y bit
implícito, exponente en exceso a M con M = 2q−1 (donde q es el número de bits del exponente)
y empaquetado en hexadecimal.
8. Codificad en un formato de 8 bits y complemento a 2 el número −45(10 y, posteriormente, empaquetadlo en hexadecimal.
9. Determinad el número mínimo de bits enteros y fraccionarios necesarios en coma fija y
signo y magnitud para codificar el número −35,25(10.
10. Codificad los números +12,25(10 y el +32,5(10 en un formato de coma fija y signo y magnitud de 9 bits de los cuales 2 son fraccionarios y sumadlos.
Representación de la información numérica
94
© FUOC • PID_00153515
Solucionario
Actividades
1.
a) 46(7 = 4 · 71 + 6 · 70 = 28 + 6 = 34(10
b) 3AD(16 = 3 · 162 + A · 161 + D · 160 = 3 · 162 + 10 · 161 + 13 · 160 = 941(10
↑
↑
Correspondencia del dígito A en base 10
Dígito D en base 10
c) 10011101(2 = 1 · 27 + 0 · 26 + 0 · 25 + 1 · 24 + 1 · 23 + 1 · 22 + 0 · 21 + 1 · 20 =
= 128 + 16 + 8 + 4 + 1 = 157(10
d) 333(4 = 3 · 42 + 3 · 41 + 3 · 40 = 48 + 12 + 3 = 63(10
e) 333(8 = 3 · 82 + 3 · 81 + 3 · 80 = 192 + 24 + 3 = 219(10
f) B2,3(16 = B · 161 + 2 · 160 + 3 · 16−1 = 11 · 161 + 2 · 160 + 3 · 16−1 =
= 176 + 2 + 0,1875 = 178,1875(10
g) 2232,02(4 = 2 · 43 + 2 · 42 + 3 · 41 + 2 · 40 + 0 · 4−1 + 2 · 4−2 =
= 128 + 32 + 12 + 2 + 0 + 0,125 = 174,125(10
h) 2464,1(8 = 2 · 83 + 4 · 82 + 6 · 81 + 4 · 80 + 1 · 8−1 = 1024 + 256 + 48 + 4 + 0,125 = 1332,125(10
i) 1110100,01101(2 = 1 · 26 + 1 · 25 + 1 · 24 + 0 · 23 + 1 · 22 + 0 · 21 + 0 · 20 + 0 · 2−1 + 1 · 2−2 +
+ 1 · 2−3 + 0 · 2−4 + 1 · 2−5 = 64 + 32 + 16 + 4 + 0,25 + 0,125 + 0,03125 = 116,40625(10
2.
a) 3245(8 → X(10
3245(8 = 3 · 83 + 2 · 82 + 4 · 81 + 5 · 80 = 1536 + 128 + 32 + 5 = 1701(10
b) 425(10 → X(2
Dividiremos el valor numérico 425 por 2 sucesivamente, y registraremos los restos de las divisiones enteras. Estos restos constituyen los dígitos binarios:
425
212
106
53
26
cocientes → 13
6
3
1
0
1 ← restos
0
0
1
0
1
0
1
1
Por lo tanto: 425(10 = 110101001(2
c) AC3C(16 → X(10
AC3C(16 = A · 163 + C · 162 + 3 · 161 + C · 160 =
= 10 · 163 + 12 · 162 + 3 · 161 + 12 · 160 =
= 40,960 + 3,072 + 48 + 12 = 44,092(10
d) 45367(10 → X(16
Dividiremos el valor numérico 45367 por 16 sucesivamente, y registraremos los restos de las
divisiones enteras hechas. Estos restos constituyen los dígitos hexadecimales:
45367
2835
177
11
0
Por lo tanto: 45367(10 = B137(16
7
3
1
11
Representación de la información numérica
95
© FUOC • PID_00153515
Representación de la información numérica
e) 344(10 → X(2
344
172
86
43
21
10
5
2
1
0
0
0
0
1
1
0
1
0
1
Por lo tanto: 344(10 = 101011000(2
3.
a) 111010011,1110100111(2 → X(16
Base 2
0001
1101
0011,
1110
1001
1100
Base 16
1
D
3,
E
9
C
Por lo tanto: 111010011,1110100111(2 = 1D3,E9C(16
b) 0,1101101(2 → X(16
Base 2
0000
1101
1010
Base 16
0,
D
A
Por lo tanto: 0,1101101(2 = 0,DA(16
c) 111011,1010010101(2 → X(16
Base 2
0011
1011,
1010
0101
0100
Base 16
3
B,
A
5
4
Por lo tanto: 111011, 1010010101 (2 = 3B,A54(16
4. Como se puede ver, el valor numérico que en base 10 se representa por 74,3(10, con una
representación en base 2, 8 y 16 tiene un número infinito de dígitos fraccionarios. En todos
estos casos, obtenemos una parte fraccionaria periódica.
Binario
Octal
Hexadecimal
Decimal
1101100,110
154,6
6C,C
108,75
11110010,010011
362,23
F2,4C
242,296875
10100001,00000011
241,006
A1,03
161,01171875
1001010,0100110011…
112,2314631463…
4A,4CCCCC…
74,3
5. Podemos aprovechar la propiedad de que 16 = 24 y 16 = 42 para tratar el paso de base 16 a
base 2 y a base 4 dígito a dígito. Es decir, cada dígito hexadecimal se transformará en un conjunto de cuatro dígitos binarios, mientras que cada dígito hexadecimal se puede transformar
en dos dígitos en base 4. El paso a base 8 no se puede hacer directamente desde base 16, dado
que 16 no es potencia de 8. Aprovecharemos la base 2 como base intermedia. 8 es potencia
de 2 (8 = 23) y, por lo tanto, tenemos una correspondencia directa: cada agrupación de tres
dígitos se corresponderá con un dígito octal.
a) ABCD(16 → X(2, X(4, X(8
Base 16
A
B
C
D
Base 2
1010
1011
1100
1101
Base 4
22
23
30
31
96
© FUOC • PID_00153515
Representación de la información numérica
Base 2
0011
010
101
111
001
101
Base 8
1
2
5
7
1
5
Por lo tanto: ABCD(16 = 1010101111001101(2 = 22233031(4 = 125715(8
b) 45,45(16 → X(2, X(4, X(8
Base 16
4
5,
4
5
Base 2
0100
0101,
0100
0101
Base 4
10
11,
10
11
Base 2
001
000
101,
010
001
010
Base 8
1
0
5,
2
1
2
Por lo tanto: 45,45(16 = 1000101,01000101(2 = 1011,1011(4 = 105,212(8
c) 96FF,FF(16 → X(2, X(4, X(8
Base 2
001
001
011
011
111
111,
111
111
110
Base 8
1
1
3
3
7
7,
7
7
6
Base 16
9
6
F
F,
F
F
Base 2
1001
0110
1111
1111,
1111
1111
Base 4
21
12
33
33,
33
33
Por lo tanto: 96FF,FF(16 = 1001011011111111,11111111(2 = 21123333,3333(4 = 113377,776(8
6.
a) 4365,14(10 → X(2
• Parte fraccionaria
0,14 · 2 =
0,28 · 2 =
0,56 · 2 =
0,12 · 2 =
0,24 · 2 =
0,48 · 2 =
0,96 · 2 =
0,92 · 2 =
0,84 · 2 =
0,68 · 2 =
0,36 · 2 =
0,72 · 2 =
...
• Parte entera
0,28 =
0,56 =
1,12 =
0,24 =
0,48 =
0,96 =
1,92 =
1,84 =
1,68 =
1,36 =
0,72 =
1,44 =
0
0
1
0
0
0
1
1
1
1
0
1
+ 0,28
+ 0,56
+ 0,12
+ 0,24
+ 0,48
+ 0,96
+ 0,92
+ 0,84
+ 0,68
+ 0,36
+ 0,72
+ 0,44
4.365
2.182
1.091
545
272
136
68
34
17
8
4
2
1
0
1
0
1
1
0
0
0
0
1
0
0
0
1
Por lo tanto, si 0,14 (10 = 0,001000111101…(2 y 4365(10 = 1000100001101(2, entonces:
4365,14(10 = 4365(10 + 0,14(10 = 1000100001101(2 + 0,001000111101…(2 =
= 1000100001101,001000111101…(2
b) 234,2(5 → X(2
Pasamos a base 10:
234,2(5 = 2 · 52 + 3 · 51 + 4 · 50 + 2 · 5−1 = 50 + 15 + 4 + 0,4 = 69,4(10
A continuación, hacemos las operaciones pertinentes para pasar a base 2:
97
© FUOC • PID_00153515
• Parte fraccionaria
Representación de la información numérica
• Parte entera
0,4 · 2 =
0,8 · 2 =
0,6 · 2 =
0,2 · 2 =
0,4 · 2 =
…
0,8 =
1,6 =
1,2 =
0,4 =
0,8 =
+ 0,8
+ 0,6
+ 0,2
+ 0,4
+ 0,8
0
1
1
0
0
69
34
17
8
4
2
1
0
1
0
1
0
0
0
1
Por lo tanto, si 0,4 (10 = 0,01100110…(2 i 69(10 = 1000101(2, entonces:
234,2(5= 69,4(10 = 69(10 + 0,4(10 = 1000101(2 + 0,01100110…(2 =
= 1000101,01100110…(2
c) 31,125(10 → X(2
• Parte fraccionaria
• Parte entera
0,125 · 2 =
0,25 · 2 =
0,50 · 2 =
0,25 =
0,50 =
1,00 =
0
0
1
+ 0,25
+ 0,50
+ 0,00
31
15
7
3
1
0
1
1
1
1
1
Por lo tanto, si 0,125 (10 = 0,001(2 y 31(10 = 11111(2, entonces: 31,125(10 = 11111,001(2
7.
a) 10011001,1101(2 → X(10
10011001,1101(2 = 1 · 27 + 0 · 26 + 0 · 25 + 1 · 24 + 1 · 23 + 0 · 22 + 0 · 21 +
+ 1 · 20 + 1 · 2−1 + 1 · 2−2 + 0 · 2−3 + 1 · 2−4 =
= 128 + 16 + 8 + 1 + 0,5 + 0,25 + 0,0625 = 153,8125(10
b) 110011,11(4 → X(10
110011,11(4 = 1 · 45 + 1 · 44 + 0 · 43 + 0 · 42 + 1 · 41 + 1 · 40 + 1 · 4−1 + 1 · 4−2 =
= 1.024 + 256 + 4 + 1 + 0,25 + 0,0625 =
= 1285,3125(10
c) 1010,11(8 → X(10
1010,11(8 = 1 · 83 + 0 · 82 + 1 · 81 + 0 · 80 + 1 · + 1 · 8−1 + 1 · 8−2 =
= 512 + 8 + 0,125 + 0,015625 =
= 520,140625(10
8.
d.
a.
1
+
1
1
1
1
1
1
← transporte
1
1
1
0
1
1
0
1
0
(2
1
0
0
1
1
0
1
0
0
(2
1
0
0
0
0
1
1
1
0
(2
1
1
0
1
1
−
1
0
1
0
1
← transporte
(2
1
0
0
1
1
0
1
0
0
(2
0
1
0
1
0
0
1
1
0
(2
98
© FUOC • PID_00153515
b.
Representación de la información numérica
e.
2
+
2
3
4
5
(8
3
2
1
(8
6
6
6
(8
2
3
4
5
(8
3
2
1
(8
2
0
2
4
(8
F
(16
−
c.
f.
+
1
← transporte
A
2
3
1
1
← transporte
5
4
A
3
(16
4
D
9
C
(16
A
2
3
F
(16
5
4
A
3
(16
F
6
E
2
(16
−
9.
b.
a.
+
1
1
← transporte
6
2,
4
8
(16
3
5,
D
F
(16
9
8,
2
7
(16
c.
1
+
1
1
1
1
← transporte
1
0
1,
1
1
0
0
1
0
0,
1
1
1
0
0
0
1
0,
1
0
1
1
1
(2
0
1
1
0
1,
1
1
0
1
1
(2
1
1
1
← transporte
1
1
1
1
1
1
1
1
1
1
0
1
1
0
0
1
1
1
0
0
1
1
1
1
1
1
1
1
1
(2
(2
d.
−
6
2,
4
8
1
1
1
← transporte
3
5,
D
F
(16
2
C,
6
9
(16
(16
−
1
0
0
1
1
0
1
0
0,
1
1
1
0
1
0
1
1
1
0
0
0,
1
1
1
10. La multiplicación de un número por bk donde b es la base de numeración, equivale a desplazar la coma fraccionaria k posiciones a la derecha.
a) 128,7(10 · 104 = 128,7(10 · 10000(10 = 1287000(10
b) AFD(16 · 162 = AFD(16 · 100(16 = AFD00(16
c) 1101,01(2 · 22 = 1101,01(2 · 100(2 = 110101(2
11. La división de un número por bk donde b es la base de numeración equivale a desplazar
la coma fraccionaria k posiciones a la izquierda.
a) 52978(10 / 103 = 52978(10 / 1000(10 = 52,978(10
El cociente de la división entera es 52(10. El resto es 978(10.
b) 3456(16 / 162 = 3456(16 / 100(16 = 34,56(16.
El cociente de la división entera es 34(16. El resto es 56(16.
c) 100101001001(2 / 28 = 100101001001(2 / 100000000(2 = 1001,01001001(2
El cociente de la división entera es 1001 (2. El resto es 01001001 (2.
(2
1
1
(2
99
© FUOC • PID_00153515
12. Para escribir un número en notación científica, hay que identificar su mantisa, su
base y su exponente. En este caso, podemos elegir la base 10 (base en la que está representado el número), podemos tomar como mantisa 12044,4 y el exponente 0. De este modo,
una representación en notación científica del número +12044,4(10 es +12044,4(10 · 100. Algunas
representaciones en notación científica equivalentes para este número son +1204,44(10 · 101 o
+120444(10 · 10−1, entre otras.
13. Puesto que la representación científica es de la forma ±R · be, donde R es la mantisa, b la
base y e el exponente, podemos concluir que la mantisa es R = 3,143(10, la base es b = 10 y el
exponente es e = 45(10.
14. Para sumar dos números en notación científica, debemos igualar sus exponentes. Como
norma, se suelen igualar al mayor exponente. El número con menor exponente se modifica
para igualar el mayor exponente. En este caso, el mayor exponente es 5. Por lo tanto, transformamos el +123,34(10 · 103 :
+123,34(10 · 103 = +1,2334(10 · 105
Una vez los dos números tienen el mismo exponente, se puede hacer la operación de suma:
1
1
(10
· 105
89
(10
· 105
+69 , 1234
(10
· 105
+1 , 2334
+ +67 ,
15.
Para restar dos números en notación científica, tenemos que igualar sus exponentes. Como
norma general, se suele igualar al mayor exponente. El número con menor exponente se modifica para igualar el mayor exponente. En este caso, el mayor exponente es 5. Por lo tanto,
transformamos el +1223,34(10 · 10−2:
+1223,34(10 · 10−2 = +0,000122334(10 · 105
Una vez los dos números tienen el mismo exponente, se puede hacer la operación de resta:
(10
· 105
− +0 , 000122334
(10
· 105
+65 , 678777666
(10
· 105
+65 , 6789
11111
16. Dado que la base de numeración es 10, el rango de la representación del formato
x1x0,x –1x –2x –3 es [0, 99,999 (10]. La precisión de este formato es 0,001 (10, porque ésta es la
distancia entre dos números consecutivos representables en este formato, como por ejemplo el 12,121(10 y el 12,122(10. De una manera semejante, el rango de representación del formato x2x1x0,x–1x–2 es [0, 999,99(10], y su precisión es 0,01(10, la distancia entre dos números
consecutivos representables en el formato, como por ejemplo el 45,77(10 y el 45,78(10.
17. El número 925,4(10 no se puede representar en el formato x1x0,x–1x–2x–3, ya que éste número está fuera del intervalo de representación. En cambio, se puede representar en el formato x2x1x0,x–1x–2 puesto que está dentro del rango [0, 999,99(10].
18. Para escribir estos números en el formato indicado, hay que escribirlos con dos dígitos
enteros y dos dígitos fraccionarios:
a) 10(10 → 10,00(10
b) 10,02(10 → 10,02(10
c) 03,1(10 → 03,10(10
d) 03,2(10 → 03,20(10
19. La cantidad de números que se pueden representar en un determinado formato es bk donde k es el número de dígitos disponibles en el formato y b la base de numeración. Puesto que
se trata de un formato decimal, cada dígito puede tomar diez valores distintos (0-9), y dado
que el formato dispone de seis dígitos para la representación, podemos representar un total
de 106 números. Observemos que la cantidad de números que se pueden representar no depende de la posición de la coma.
Representación de la información numérica
100
© FUOC • PID_00153515
Representación de la información numérica
20.
a) 22,345(10
El número 22,345(10 está directamente representado en el formato x2x1x0,x–1x–2. Por lo tanto, se trata de un número representable y el error cometido es cero.
b) 45,89(10
El número 45,89(10, es representable directamente en el formato x2x1x0, x–1x–2. La representación es 045,89(10 y es exacta. Por lo tanto, el error de representación es cero.
c) 55,6356(10
El número 55,6356(10 no se puede representar directamente en el formato x2x1x0, x–1x–2,
dado que tiene cuatro dígitos fraccionarios. Deberemos hacer una aproximación, lo cual
comporta un cierto error de aproximación.
Con una aproximación por truncamiento, la representación será 55,635(10. El error de representación que se comete es ⏐55,6356(10 − 55,635(10⏐ = 0,0006(10.
d) 23,56(10
El número 23,56(10, es representable directamente en el formato x2x1x0, x–1x–2. La representación es 023,56(10 y es exacta. Por lo tanto, el error de representación es cero.
21. Para representar este número en hexadecimal, primero lo pasaremos a binario. La representación binaria de 16,25(10, es 10000,01(2.
Para la representación hexadecimal de este número, hay que añadir ceros a los extremos hasta
disponer de grupos de 4 bits completos a lado y lado de la coma decimal. Entonces tenemos:
00010000,0100(2 = 10,4(16.
Por lo tanto, la representación hexadecimal que necesitamos es x1x0,x–1 donde x son dígitos
hexadecimales:
El rango de esta representación es: [0 (00,0(16), 255,9375(10 (FF,F(16)].
• La precisión es: 0,0625(10 = 00,1(16 − 00,0(16.
22. Para que en una representación decimal de cuatro dígitos sin signo se produzca desbordamiento, debemos sobrepasar el número 9999(10; por lo tanto, tendremos desbordamiento
cuando la suma de dos números sea 10000(10. Entonces, el menor número que debemos sumar
a 8341(10 es 10000(10 − 8341(10 = 1659(10.
23. Pasamos los valores numéricos a binario:
a.
b.
53
26
13
6
3
1
0
c.
25
12
6
3
1
0
1
0
1
0
1
1
1
0
0
1
1
93
46
23
11
5
2
1
0
1
0
1
1
1
0
1
64
32
16
8
4
2
1
0
0
0
0
0
0
1
+53(10 = +110101(2 − 25(10 = −11001(2 + 93(10 = +1011101(2
d.
e.
127
63
31
15
7
3
1
1 1
0
f.
1
1
1
1
1
1
−1(10 = −1(2 − 127(10 = −1111111(2 − 64(10 = −1000000(2
Para obtener la representación en signo y magnitud, sólo debemos poner el bit de signo y
añadir la magnitud expresada en 7 bits:
Base 10
Base 2
Signo y magnitud
+53(10
+110101(2
00110101(2
−25(10
−11001(2
10011001(2
+93(10
+1011101(2
01011101(2
−1(10
−1(2
10000001(2
−127(10
−1111111(2
11111111(2
−64(10
−1000000(2
11000000(2
101
© FUOC • PID_00153515
Representación de la información numérica
La representación en Ca2 de las magnitudes positivas coincide con la representación en signo y magnitud. La representación en Ca2 de las magnitudes negativas se puede obtener de
distintas maneras:
i) Se puede hacer la operación 28 − ⏐X⏐ en base 10, y pasar posteriormente el resultado a binario.
ii) Podemos hacer la operación 28 − ⏐X⏐ directamente en base 2.
iii) Se aplica un cambio de signo a la magnitud positiva en Ca2.
a) El +53(10 = +110101(2 se representa por 00110101(2 en Ca2.
b) Podemos obtener la representación en Ca2 del −25(10 de la siguiente manera:
i) 28 − 25(10 = 256(10 − 25(10 = 231(10 = 11100111(2, o bien,
ii) 28 − 25(10 = 100000000(2 − 11001(2 = 11100111(2, o bien,
iii) +25(10 = +11001(2 → Representación de la magnitud positiva → 00011001(2 →
→ cambio de signo → 11100111(2
c) El +93(10 = +1011101(2 se representa por 01011101(2 en Ca2.
d) Obtenemos la representación en Ca2 del −1(10:
i) 28 – 1 = 256(10 − 1(10 = 255(10 = 11111111(2, o bien,
ii) 28 – 1 = 100000000(2 – 1(2 = 11111111(2, o bien,
iii) +1(10 = +1(2 → Representación de la magnitud positiva → 00000001(2 →
→ Cambio de signo → 11111111(2
e) La representación en Ca2 del −127(10 se puede obtener:
i) 28 – 127 = 256(10 – 127(10 = 129(10 = 10000001(2, o bien,
ii) 28 – 127 = 100000000(2 – 1111111(2 = 10000001(2, o bien,
iii) +127(10 = +1111111(2 → Representación de la magnitud positiva → 01111111(2 →
→ Cambio de signo → 10000001(2
f) La representación en Ca2 del −64(10 se obtiene:
i) 28 – 64 = 256(10 – 64(10 = 192(10 = 11000000(2, o bien,
ii) 28 – 64 = 100000000(2 – 1000000(2 = 11000000(2, o bien,
iii) +64(10 = +1000000(2 → Representación de la magnitud positiva → 01000000(2 →
→ Cambio de signo → 11000000(2
Decimal
Binario
Complemento a 2
Signo y magnitud
+53(10
+110101(2
00110101(2
00110101(2
−25(10
−11001(2
11100111(2
10011001(2
+93(10
+1011101(2
01011101(2
01011101(2
−1(10
−1(2
11111111(2
10000001(2
−127(10
−1111111(2
10000001(2
11111111(2
−64(10
−1000000(2
11000000(2
11000000(2
24. Si consideramos que son valores en signo y magnitud, tenemos:
00110110(2 = +54(10
11011010(2 = −90(10
01110110(2 = +118(10
11111111(2 = −127(10
11100100(2 = −100(10
Si consideramos que son valores en complemento a 2:
00110110(2 = +54(10
11011010(2 = −27+ 90(10 = −38(10
01110110(2 = +118(10
11111111(2 = −27 + 127(10 = −1(10
11100100(2 = −27 + 100(10 = −28(10
27. Para hacer las operaciones de suma y resta en signo y magnitud, debemos tener en cuenta
el signo de las magnitudes y actuar consecuentemente. Para más claridad, al lado de la ope-
102
© FUOC • PID_00153515
Representación de la información numérica
ración en binario se ha hecho el equivalente en base 10. Los valores A, B y C en base 10 corresponden a:
A = 1100100111(2 = −295(10
B = 1000011101(2 = −29(10
C = 0101011011(2 = +347(10
• Suma A + B
A es negativo y B también. Por lo tanto, haremos la suma de las magnitudes (sin signo) y si
no hay desbordamiento, añadiremos un 1 como bit de signo al resultado obtenido, para conseguir el resultado en la representación en signo y magnitud:
Suma A + B
+
1
1
1
1
1
1
← transporte
1
1
← transporte
−2
9
5
(10
−2
9
(10
2
4
(10
1
0
0
1
0
0
1
1
1
(2
0
0
0
0
1
1
1
0
1
(2
1
0
1
0
0
0
1
0
0
(2
+
−3
A + B = 1101000100(2 = −324(10
• Resta A − B
A es negativo y B también. Por lo tanto, restaremos la magnitud pequeña (B) de la magnitud
grande (A) y aplicaremos el signo de la magnitud grande (A) al resultado (no se puede producir desbordamiento):
Resta A − B
1
−
0
0
1
0
0
1
1
1
1
1
← transporte
−2
(2
0
0
0
0
1
1
1
0
1
(2
1
0
0
0
0
1
0
1
0
(2
−
−2
9
5
1
← transporte
+2
9
(10
6
6
(10
(10
A − B = 1100001010(2 = −266(10
• Suma A + C
A es negativo y C es positivo. Por lo tanto, restaremos la magnitud pequeña (A) de la magnitud grande (C) y aplicaremos el signo de la magnitud grande (C) al resultado (no se puede
producir desbordamiento):
Suma A + C
1
0
1
0
1
1
−
1
0
1
1
1
← transporte
(2
1
0
0
1
0
0
1
1
1
(2
0
0
0
1
1
0
1
0
0
(2
A + C = 0000110100(2 = +52(10
+
+3
4
1
← transporte
−2
9
5
(10
+0
5
2
(10
7
(10
103
© FUOC • PID_00153515
Representación de la información numérica
• Resta A − C
A es negativo y C es positivo. Por lo tanto, haremos la suma de las magnitudes (sin signo) y,
si no hay desbordamiento, añadiremos un 1 como bit de signo al resultado obtenido, para
conseguir el resultado en la representación en signo y magnitud:
Resta A − C
Desbordamiento
↓
1
+
1
1
1
1
1
1
← transporte
1 0 0 1 0 0 1 1 1
(2
1 0 1 0 1 1 0 1 1
(2
1 0 1 0 0 0 0 0 1 0
(2
+
← transporte
1
1
−2
9 5
(10
−3
4 7
(10
−6
4 2
(10
A − C = −642(10
No se puede representar con 10 bits
en el formato de signo y magnitud.
• Resta B − C
B es negativo y C es positivo. Por lo tanto, haremos la suma de las magnitudes (sin signo) y,
si no hay desbordamiento, añadiremos un 1 como bit de signo al resultado obtenido, para
conseguir el resultado en la representación en signo y magnitud:
Resta B − C
1
+
1
1
1
1
← transporte
0 0 0 0 1 1 1 0 1
(2
1 0 1 0 1 1 0 1 1
(2
1 0 1 1 1 1 0 0 0
(2
+
1
← transporte
−2
9
(10
−3
4
7
(10
−3
7
6
(10
B − C = 1101111000(2 = –376(10
• Suma B + C
B es negativo y C es positivo. Por lo tanto, restaremos la magnitud pequeña (B) de la magnitud grande (C) y aplicaremos el signo de la mayor magnitud (C) al resultado (no se puede
producir desbordamiento):
Suma B + C
1 0 1 0 1 1 0 1 1
1
−
1
1
1
← transporte
0 0 0 0 1 1 1 0 1
(2
1 0 0 1 1 1 1 1 0
(2
B + C = 0100111110(2 = +318(10
+3
(2
−
+3
4
7
1
← transporte
+2
9
(10
1
8
(10
(10
104
© FUOC • PID_00153515
Representación de la información numérica
26. Para hacer las operaciones de suma Ca2, operaremos directamente sobre las representaciones. El resultado será correcto siempre que no se produzca desbordamiento. Para hacer las operaciones de resta, aplicaremos un cambio de signo al sustraendo y haremos una operación de
suma:
A = 1100100111(2 = −217(10
B = 1000011101(2 = −483(10
C = 0101011011(2 = +347(10
• Suma A + B
Suma A + B
Desbordamiento
↓
1
1
1
1
1
1
1
1 1 0 0 1 0 0 1 1 1
(2
1 0 0 0 0 1 1 1 0 1
(2
1 0 1 0 1 0 0 0 1 0 0
(2
+
+
1
1
−2
1 7
(10
−4
8 3
(10
−7
0 0
(10
A + B = −700(10
Se produce desbordamiento, dado que al sumar dos números negativos obtenemos uno positivo. El resultado no cabe en el formato de salida. Recordemos que el rango de representación de enteros con 10 bits con el formato de complemento a 2 es [−210−1, 210−1 − 1] = [−512,
511].
• Resta A − B
Aplicaremos un cambio de signo a B y haremos una operación de suma:
1000011101
^ Se mantienen los bits hasta aquí (el primer 1 que encontramos, incluyendo éste)
1
^ Se complementan los bits a partir de este punto
011110001
Al aplicar el cambio de signo al 1000011101, obtenemos el 0111100011, que será el valor que
utilizaremos en la suma:
Suma A + (−B)
Transporte que se desprecia
↓
1
+
1
1
1
1
1
1
1
← transporte
1 1 0 0 1 0 0 1 1 1
(2
0 1 1 1 1 0 0 0 1 1
(2
1 0 1 0 0 0 0 1 0 1 0
(2
A − B = 0100001010 = +266(10
+4
8 3
1
+
(10
← transporte
−2
1 7
(10
+2
6 6
(10
105
© FUOC • PID_00153515
Representación de la información numérica
• Suma A + C
A es negativo y C es positivo. No se puede producir desbordamiento:
Suma A + C
Transporte que se desprecia
↓
1
1
1
1
1
1
1
1
1
← transporte
1 1 0 0 1 0 0 1 1 1
(2
0 1 0 1 0 1 1 0 1 1
(2
1 0 0 1 0 0 0 0 0 1 0
(2
+
+3
4 7
1
+
(10
← transporte
−2
1 7
(10
+1
3 0
(10
A + C = 0010000010 = +130(10
• Resta A − C
Aplicaremos un cambio de signo a C y haremos una operación de suma:
+
0101011011 ←
Valor numérico inicial
1010100100 ←
Complemento bit a bit de la expresión inicial
1 ←
1010100101
Sumamos 1 al bit menos significativo del formato
Al aplicar un cambio de signo al 0101011011, obtenemos el 1010100101, que será el valor
que utilizaremos en la suma:
Suma A + (−C)
Desbordamiento
↓
1
1
1
1
1
← transporte
1 1 0 0 1 0 0 1 1 1
(2
1 0 1 0 1 0 0 1 0 1
(2
1 0 1 1 1 0 0 1 1 0 0
(2
+
1
+
← transporte
−2
1 7
(10
−3
4 7
(10
−5
6 4
(10
A − C = −564(10
Se produce desbordamiento, puesto que al sumar dos números negativos obtenemos uno positivo. El resultado no cabe en el formato de salida. Recordemos que el rango de representación
de enteros con 10 bits con el formato de complemento a 2 es [−210−1, 210−1 − 1] = [−512, 511].
• Resta B − C
Aplicaremos un cambio de signo a C y haremos una operación de suma. Al aplicar un cambio
de signo al 0101011011 obtenemos el 1010100101, que será el valor que utilizaremos en la
suma:
Suma B + (−C)
Desbordamiento
↓
1
+
1
1
1
1
1
← transporte
1 0 0 0 0 1 1 1 0 1
(2
1 0 1 0 1 0 0 1 0 1
(2
1 0 0 1 1 0 0 0 0 1 0
(2
B − C = −830(10
+
← transporte
1
1
−4
8 3
(10
−3
4 7
(10
−8
3 0
(10
106
© FUOC • PID_00153515
Representación de la información numérica
Se produce desbordamiento, dado que al sumar dos números negativos, obtenemos uno positivo. El resultado no cabe en el formato de salida.
• Suma B + C
B es negativo y C es positivo. No se puede producir desbordamiento:
Suma B + C
1
+
1
1
1
1
← transporte
1 0 0 0 0 1 1 1 0 1
(2
0 1 0 1 0 1 1 0 1 1
(2
1 1 0 1 1 1 1 0 0 0
(2
1
+
1
← transporte
−4
8 3
(10
+3
4 7
(10
−1
3 6
(10
B + C = 1101111000 = −136(10
27.
a) Si la cadena de bits 10110101 representa un número en Ca2 se trata de un número negativo, ya que el primer bit es 1. Podemos hacer un cambio de signo para obtener la magnitud
positiva:
1 0 1 1 0
1
0
1 ← Valor numérico inicial
0 1 0 0 1
0
1
0 ← Complemento bit a bit de la expresión inicial
1 ← Sumamos 1 al bit menos significativo del formato
+
0 1 0 0 1
0
1
1
Para codificar el valor inicial en signo y magnitud, únicamente debemos cambiar el bit de
signo del valor conseguido con el cambio de signo. Por lo tanto, la codificación en signo y
magnitud del valor 10110101 que está en Ca2 es 11001011(2.
La codificación en 16 bits se puede obtener por extensión del formato, que en este caso se
consigue si añadimos unos necesarios a la izquierda del MSB:
11001011(2 = 1111111111001011(2
b) Si se trata de un número codificado en signo y magnitud, es un número negativo, ya que
el primer dígito corresponde al signo y es 1. El resto de los dígitos codifican la magnitud en
binario. Podemos obtener la magnitud positiva si cambiamos el bit de signo: 00110101(2.
La representación de los valores positivos coincide en Ca2 y en signo y magnitud. Por lo tanto, a partir de la magnitud positiva en Ca2 podemos conseguir la magnitud negativa en si
aplicamos un cambio de signo:
0 0 1 1 0
1
0
1 ← Valor numérico inicial
1 1 0 0 1
0
1
0 ← Complemento bit a bit de la expresión inicial
1 ← Sumamos 1 al bit menos significativo del formato
+
1 1 0 0 1
0
1
1
Por lo tanto, la codificación en Ca2 del valor 10110101(2 que está en signo y magnitud es
11001011(2.
107
© FUOC • PID_00153515
La codificación en 16 bits se puede obtener por extensión del formato, que en este caso se
consigue copiando el bit de más peso a la izquierda de la codificación tantas veces como sea
necesario:
11001011(2 = 1111111111001011(2
28. Para poder representar el intervalo [−25,50] en una representación en exceso será necesario elegir un desplazamiento que transforme este intervalo en un intervalo de números naturales. La transformación del intervalo que se obtiene al sumar M es [−25 + M, 50 + M]. Para
que este intervalo sea un intervalo de los naturales, es necesario que −25 + M ≥ 0 y, por lo
tanto, el valor del exceso que permite representar este intervalo es M = 25.
29.
a) Los números 3(10 y −8(10 se codifican en exceso a 7 y decimal de la manera siguiente:
3(10 + 7(10 = 10(10 · 3(10 codificado en exceso a 7(10 es 10(10.
−8(10 + 7(10 = −1(10 · −8(10 codificado en exceso a 7(10 es −1(10.
b) El número −4(10 se codifica en 6 bits y exceso a 7 de la manera siguiente:
−4(10 + 7(10 = 3(10. −4 codificado en exceso a 7 es 3(10 y codificado en base 2 es 000011(2.
c) Los números 3(10 y −6(10 se codifican en exceso a 4 de 8 bits:
3(10 + 4(10 = 7(10. 3 codificado en exceso a 4 es 7(10 y codificado en base 2 es 00000111(2.
−6(10 + 4(10 = −2(10. El resultado de la codificación es un número negativo. Por lo tanto, el número −6 no se puede codificar en exceso a 4.
30.
Si aplicamos el TFN, obtenemos que 000000(2 = 0(10.
Por lo tanto, el número que codifica es 0(10 − 31(10 = −31(10.
Si aplicamos el TFN, obtenemos que 100000(2 = 32(10.
Por lo tanto, el número que codifica es 32(10 − 31(10 = 1(10.
Si aplicamos el TFN, obtenemos que 111111(2 = 63(10.
Por lo tanto, el número que codifica es 63(10 − 31(10 = 32(10.
31. Sabemos que 25(10 = 100000(2. Este número marcará el 0 en la representación en exceso.
Es decir, los números menores que éste representarán negativos y los mayores serán positivos
(hay que darse cuenta de que los números menores, es decir, los negativos, empezarán con 0,
mientras que los mayores, es decir, los positivos, empezarán con 1).
El número 011100(2 es negativo.
El número 100111(2 es positivo.
El número 000000(2 es negativo.
32.
← transporte
1
+
−
0 0 0 1 0 0
(2
1 0 0 1 0 0
(2
1 0 1 0 0 0
(2
1 0 1 0 0 0
(2
1 0 0 0 0 0
(2
0 0 1 0 0 0
(2
se suman los 2 números
restamos el exceso
La suma de estos números en exceso a 25 es 000100(2 + 100100(2 = 001000(2 que es el −24(10
en exceso a 100000(2 ( = 32(10).
Representación de la información numérica
108
© FUOC • PID_00153515
33.
0 0 0 1 0 0
−
(2
← transporte
1
← los dos números se restan
1 0 0 1 0 0
(2
1 1 0 0 0 0 0
(2
1
← transporte
1 1 0 0 0 0 0
(2
1 0 0 0 0 0
(2
1 0 0 0 0 0 0 0
(2
1
+
← sumamos el exceso
El resto de estos números en exceso a 25 es 000100(2 − 100100(2 = 000000(2 que es el –32(10
en exceso a 100000(2 ( = 32(10).
34.
a)
Exceso a 10000(2
+
−
Decimal
1 1 0 0 0
(2
(+8(10)
0 0 0 0 0
(2
(−32(10)
1 1 0 0 0
(2
1 1 0 0 0
(2
1 0 0 0 0
(2
0 1 0 0 0
(2
(−24(10)
La suma de estos números en exceso a 25 es 11000(2 + 00000(2 = 01000(2 = −24(10
b)
Exceso a 10000(2
+
Decimal
0 0 0 0 0
(2
(−32(10)
0 0 0 0 0
(2
(−32(10)
0 0 0 0 0
(2
0 0 0 0 0
(2
← transporte
1
−
1 0 0 0 0
(2
1 1 0 0 0 0
(2
(0(10)
Podemos observar que el resultado de la suma no es correcto, ya que los dos números iniciales son negativos, mientras que el resultado es positivo. Además, podemos detectar que el resultado es incorrecto porque hay desbordamiento en la última operación.
Representación de la información numérica
109
© FUOC • PID_00153515
c)
Exceso a 10000(2
Decimal
← transporte
1
0 1 0 0 0
(2
(−8(10)
1 1 1 1 1
(2
(+15(10)
1 0 0 1 1 1
(2
1 0 0 1 1 1
(2
+
← transporte
1
−
1 0 0 0 0
(2
0 1 0 1 1 1
(2
(+7(10)
La suma de estos números en exceso a 25 es 01000(2 + 11111(2 = 010111(2 = 7(10.
35.
a) Con este formato, el número binario que representa esta tira de bits es 101,0010(2, y al aplicar el TFN, se obtiene el número decimal que representa:
101,0010(2 = 1 · 22 + 0 · 21 + 1 · 20 + 0 · 2–1 + 0 · 2–2 + 1 · 2–3 + 0 · 2–4 =
= 22 + 20 + 2–3 =
= 4 + 1 + 0,125 =
= 5,125(10 =
b) En este caso, el número binario que representa esta tira de bits es 101001,0(2 , y al aplicar
el TFN, se obtiene el número decimal que representa:
101001,0(2 = 1 · 25 + 0 · 24 + 1 · 23 + 0 · 22 + 0 · 21 + 1 · 20 + 0 · 2–1 =
= 25 + 23 + 20 =
= 32 + 8 + 1 =
= 41(10 =
36. Codificamos el número +12,85(10 en el formato especificado. Puesto que se trata de un
número positivo, el bit de signo es 0. En lo que respecta a la magnitud 12,85(10, primero pasamos a binario la parte entera y, posteriormente, la parte fraccionaria. Para la parte entera,
utilizamos el algoritmo de divisiones sucesivas por la base de llegada (2):
12
6
3
1
=
=
=
=
6·2
3·2
1·2
0·2
+
+
+
+
0
0
1
1
Así pues, 12(10 = 1100(2. En lo que respecta a la parte fraccionaria, hacemos multiplicaciones
sucesivas por la base de llegada (2):
0,85
0,70
0,40
0,80
0,60
·
·
·
·
·
2
2
2
2
2
=
=
=
=
=
1,70
1,40
0,80
1,60
1,20
=
=
=
=
=
1 + 0,70
1 + 0,40
0 + 0,80
1 + 0,60
1 + 0,20
Puesto que el formato especificado sólo tiene 3 bits para la parte fraccionaria, ya tenemos más
bits de los necesarios y podemos detener el proceso aquí. Por lo tanto, 0,85(10 = 0,11011…(2.
Para aproximar el valor con 3 bits y redondeo, procedemos como sigue:
0,11011(2 + 0,0001(2 = 0,11101(2 → truncamos 3 bits → 0,111(2
A continuación, juntamos la parte entera y la fraccionaria y obtenemos: 12,85(10 = 1100,111(2.
Finalmente, para obtener la representación en el formato indicado, hay que añadir el bit de signo, de manera que la tira de bits que representa este número en el formato dado es: 01100,111(2.
Hay que recordar que la tira de bits que se almacenaría en un computador no contiene la coma
ni la especificación de la base: 01100111.
En los otros dos casos, procedemos de manera totalmente análoga.
+0,7578125(10:
• El bit de signo es 0, porque el número es positivo.
Representación de la información numérica
110
© FUOC • PID_00153515
• La parte entera es 0(10 = 0(2. Puesto que tenemos 4 bits para la parte entera, escribiremos
0000(2.
• En lo que respecta a la parte fraccionaria:
0,7578125
0,515625
0,03125
0,0625
0,1250
·
·
·
·
·
2
2
2
2
2
=
=
=
=
=
1,515625
1,03125
0,0625
0,125
0,25
=
=
=
=
=
1 + 0,515625
1 + 0,03125
0 + 0,0625
0 + 0,125
0 + 0,25
De este modo, 0,7578125(10 = 0,11011…(2 que, si redondeamos con 3 bits:
0,11000(2 + 0,0001(2 = 0,11010(2 → truncamos 3 bits → 0,110(2
Finalmente, se juntan todas las partes y obtenemos 0,7578125(10 = 00000,110(2. Por lo tanto,
la tira de bits que se almacenaría en un computador es 00000110.
−11,025(10:
• El bit de signo es 1, porque el número es negativo.
• La parte entera es 11(10:
11
5
2
1
=
=
=
=
5·2
2·2
1·2
0·2
+
+
+
+
1
1
0
1
Es decir, 11(10 = 1011(2.
En lo que respecta a la parte fraccionaria:
0,025
0,05
0,1
0,2
0,4
·
·
·
·
·
2
2
2
2
2
=
=
=
=
=
0,05
0,1
0,2
0,4
0,8
=
=
=
=
=
0 + 0,05
0 + 0,1
0 + 0,2
0 + 0,4
0 + 0,8
De este modo, 0,025 (10 = 0,00000… (2 que, si redondeamos con 3 bits:
0,00000 (2 + 0,0001(2 = 0,00010(2 → truncamos 3 bits → 0,000(2
Finalmente, se juntan todas las partes y obtenemos –11,025(10 = 11011,000(2. Por lo tanto, la
tira de bits que se almacenaría en un computador es 11011000.
37. Para obtener la representación decimal de estas cadenas de bits, sólo hay que aplicar el TFN
considerando que los tres últimos bits constituyen la parte fraccionaria y que el primer bit representa el signo:
01001111→ +1001,111(2
+1001,111(2 =
=
=
=
1 · 23 + 0 · 22 + 0 · 21 + 1 · 20 + 1 · 2–1 + 1 · 2–2 + 1 · 2–3 =
23 + 20 + 2–1 + 2–2 + 2–3 =
8 + 1 + 0,5 + 0,25 + 0,125 =
+9,875(10
11001111 → –1001,111(2
–1001,111(2 = –(1 · 23 + 0 · 22 + 0 · 21 + 1 · 20 + 1 · 2–1 + 1 · 2–2 + 1 · 2–3) =
= –(23 + 20 + 2–1 + 2–2 + 2–3 ) = –(8 + 1 + 0,5 + 0,25 + 0,125) =
= –9,875(10
01010100 → +1010,100(2
+1010,100(2 = 1 · 23 + 0 · 22 + 1 · 21 + 0 · 20 + 1 · 2–1 + 0 · 2–2 + 0 · 2–3 = 23 + 21 + 2–1 =
= 8 + 2 + 0,5 = +10,5(10
00000000 → +0000,000(2
+0000,000(2 = 0 · 23 + 0 · 22 + 0 · 21 + 0 · 20 + 0 · 2–1 + 0 · 2–2 + 0 · 2–3 =
= +0(10
10000000 → –0000,000(2
–0000,000(2 = – (0 · 23 + 0 · 22 + 0 · 21 + 0 · 20 + 0 · 2–1 + 0 · 2–2 + 0 · 2–3) =
= –0(10
Representación de la información numérica
111
© FUOC • PID_00153515
38. Para extender el rango de estas tiras de bits, hay que añadir ceros tanto a la izquierda
como a la derecha de la magnitud, dado que se trata de magnitudes sin signo.
La representación original tiene 5 bits para la parte entera y la representación de llegada tiene 8.
Por lo tanto, hay que añadir 8 – 5 = 3 bits a la izquierda de la magnitud. De la misma manera, la
representación original tiene 3 bits para la parte fraccionaria, mientras que la representación de
llegada tiene 4. Así pues, añadir 4 – 3 = 1 bit a la derecha de la magnitud:
00101010 → 00101,010 → 00000101,0100 → 000001010100
11010010 → 11010,010 → 00011010,0100 → 000110100100
10100010 → 10100,010 → 00010100,0100 → 000101000100
39. En este caso, hay que considerar que el primer bit representa el signo. La extensión de la
parte entera implica insertándole tantos ceros como sea necesario. En este caso, pasamos de 4
a 7 bits para la parte entera; por lo tanto, habrá que añadir 7 – 4 = 3 bits a la izquierda de la
parte entera. En lo que respecta a la parte fraccionaria, la situación es idéntica en el ejercicio
anterior. Así pues, habrá que añadir 4 – 3 = 1 bit a la derecha de la magnitud:
00101010 → 0101,010 → 0000101,0100 → 000001010100
11010010 → 1010,010 → 0001010,0100 → 100010100100
10100010 → 0100,010 → 0000100,0100 → 100001000100
40.
a) El rango de una representación fraccionaria con signo y magnitud es:
[–2n–m–1 + 2–m, +2n–m–1 – 2–m]
donde n es el número de bits utilizado en la representación y m el número de dígitos fraccionarios. Por lo tanto, el rango en este caso se obtiene haciendo n = 8 y m = 3, es decir:
[–28–3–1 + 2–3, +28–3–1 – 2–3] = [–24 + 2–3, +24 – 2–3] = [–15,875(10, +15,875(10]
En lo que respecta a la precisión, es determinada por el bit de menos peso de la magnitud,
concretamente 2–m = 2–3 = 0,125(10.
b) En este caso la situación es la misma que en el apartado anterior, pero con n = 8 y m = 4.
El rango es el siguiente:
[–28–4–1 + 2–4, +28–4–1 – 2–4] = [–23 + 2–4, +23 – 2–4] = [–7,9375(10, +7,9375(10]
De manera análoga, la precisión es 2–m = 2–4 = 0,0625(10.
c) En coma fija sin signo, el rango de representación es determinado por:
[0, +2n–m – 2–m]
donde n es el número de bits utilizado en la representación, y m el número de dígitos fraccionarios. Por lo tanto, el rango en este caso se obtiene haciendo n = 8 y m = 3, es decir:
[0, +28–3 – 2–3] = [0, +25 – 2–3] = [0, +31,875(10].
La precisión es la misma que en los casos anteriores, porque es independiente de si la representación es sin signo o en signo y magnitud. Por lo tanto, la precisión es 2–m = 2–3 = 0,125.
d) En este caso, la situación es la misma que en el apartado anterior, pero con n = 8 y m = 4.
El rango es el siguiente:
[0, +28–4 – 2–4] = [0, +24 – 2–4] = [0, +15,9375(10].
De manera análoga, la precisión es 2–m = 2–4 = 0,0625(10.
41. Para determinar la precisión necesaria para representar el número +0,1875(10 de una manera exacta, primero codificaremos este número en binario; haremos multiplicaciones sucesivas por la base de llegada:
0,1875
0,375
0,75
0,5
·
·
·
·
2
2
2
2
=
=
=
=
0,375
0,75
1,5
1
=
=
=
=
0 + 0,375
0 + 0,75
1 + 0,5
1+0
Entonces, 0,1875(10 = 0,0011(2. Así pues, para poder representar este número de una manera
exacta es necesario que la representación disponga, como mínimo, de cuatro dígitos fraccionarios (m = 4), es decir, una precisión de la forma 2–m = 2-4 = 0,0625(10.
Representación de la información numérica
112
© FUOC • PID_00153515
42. En primer lugar, obtendremos la codificación en signo y magnitud de estos dos números:
a) +31,875(10:
• El bit de signo es 0, porque el número es positivo.
• La parte entera es 31(10:
31
15
7
3
1
=
=
=
=
=
15 · 2
7·2
3·2
1·2
0·2
+
+
+
+
+
1
1
1
1
1
Es decir: 31(10 = 11111(2.
• En lo que respecta a la parte fraccionaria:
0,875
0,75
0,5
·
·
·
2
2
2
= 1,75
= 1,5
= 1
1 + 0,75
1 + 0,5
1+0
=
=
=
Así pues: 0,875 (10 = 0,111(2
• Finalmente, se juntan todas las partes y obtenemos +31,875(10 → 011111,111(2.
b) –16,21875(10
• El bit de signo es 1, porque el número es positivo.
• La parte entera es 16(10:
16
8
4
2
1
=
=
=
=
=
8·2
4·2
2·2
1·2
0·2
+
+
+
+
+
0
0
0
0
1
Es decir, 16(10 = 10000(2.
• En lo que respecta a la parte fraccionaria:
0,21875
0,4375
0,875
0,75
0,5
·
·
·
·
·
2
2
2
2
2
=
=
=
=
=
0,4375
0,875
1,75
1,5
1
=
=
=
=
=
0 + 0,4375
0 + 0,875
1 + 0,75
1 + 0,5
1+0
Así pues: 0,21875 (10 = 0,00111(2
• Finalmente, se juntan todas las partes y obtenemos –16,21875(10 = 110000,00111.
Para representar exactamente los dos números, es necesario un formato que tenga:
• Un bit de signo.
• 5 bits para la parte entera (con 5 bits se pueden representar exactamente tanto 16(10 como
31(10).
• 5 bits para la parte fraccionaria (con 5 bits se pueden representar exactamente tanto
0,875(10 como 0,21875(10).
Tenemos, por lo tanto, un formato de signo y magnitud con n = 11 (bit de signo, 5 bits de
parte entera y 5 bits de parte fraccionaria) y m = 5. Con estos datos, el rango es el siguiente:
[–2n–m–1 + 2–m, +2n–m–1 – 2–m] = [–211–5–1 + 2–5, +211–5–1 – 2–5] =
= [–25 + 2–5, +25 – 2–5] = [–31,96875(10, +31,96875(10]
La precisión es 2–m = 2–5 = 0,03125(10.
43.
a)
00111000(2 → +0111,000(2 = 1 · 22 + 1 · 21 + 1 · 20 = 4 + 2 + 1 = +7(10
10100000(2 → –0100,000(2 = –1 · 22 = –4(10
Para calcular la suma de estos dos números es necesario, primero, darse cuenta de que se trata
de números de diferente signo. Por lo tanto, la suma se obtendrá restando la mayor magnitud
(0111,000(2) de la menor (0100,000(2) y copiando el signo de la mayor magnitud (positivo):
0 1 1 1
0
0
,
0
0
0
0
0
0
(2
← transportes
− 0 1 0 0
,
0
0
0
(2
0 0 1 1
,
0
0
0
(2
← resultado
Representación de la información numérica
113
© FUOC • PID_00153515
Por lo tanto:
00111000(2 + 10100000(2 +0111,000(2 + (–0100,000(2) = +0011,000(2 → 00011000(2.
Si convertimos el resultado a base 10:
+0011,000(2 = 1 · 21 + 1 · 20 = 2 + 1 = 3(10
Que demuestra que el resultado es correcto, ya que +7(10 + (–4(10) = 3(10.
Para calcular la resta será necesario hacer la suma de las magnitudes, porque el número
10100000(2 es negativo. El resultado de la resta será positivo (porque a un número positivo
le restamos uno negativo):
1 0 0 0
+
0
← transportes
0
0 1 1 1 , 0 0 0
(2
0 1 0 0 , 0 0 0
(2
1 0 1 1 , 0 0 0
(2
← resultado
Por lo tanto:
00111000(2 – 10100000(2 → +0111,000(2 – (–0100,000(2) = +1011,000(2 = 01011000(2
De nuevo, podemos comprobar que el resultado obtenido es correcto si lo convertimos a base 10:
+1011,000(2 = 23 + 21 + 20 = 8 + 2 + 1 = +11(10 = +7(10 – (–4(10)
b)
10111010(2 → –0111,010(2 = –(22 + 21 + 20 + 2–2) = –(4 + 2 + 1 + 0,25) = –7,25(10
11101100(2 → –1101,100(2 = – (23 + 22 + 20 + 2–1) = –(8 + 4 + 1 + 0,5) = –13,5(10
En este caso se trata de dos números negativos, dado que el primer dígito, que indica el signo, es
un 1 en los dos casos. Para hacer la suma, se deberá sumar las magnitudes y copiar el bit signo:
1
+
1
1
1
0
0
0
← transportes
0 1 1 1
,
0
1
0
(2
1 1 0 1
,
1
0
0
(2
0 1 0 0
,
1
1
0
(2
← resultado
Observad que se ha producido transporte en el último bit y, por lo tanto, puesto que estamos sumando sólo las magnitudes, hay desbordamiento. Esto quiere decir que el resultado de la suma
no es representable con 8 bits de los cuales 3 son fraccionarios.
Si dispusiéramos de un bit más para la parte entera (un formato de 9 bits con 3 fraccionarios),
el resultado sí que sería representable:
–10100,110(2 → 110100110.
Efectivamente, comprobamos que:
–10100,110(2 = –(24 + 22 + 2–1 + 2–2) = –(16 + 4 + 0,5 + 0,25) = –20,75(10 = –7,25(10 + (–13,5(10).
En lo que respecta al resto, hay que darse cuenta de que el sustraendo (–1101,100(2) es mayor
en magnitud que el minuendo (–0111,010(2). Así pues, haremos la resta de las magnitudes
como 1101,100(2 – 0111,010(2 y el resultado debe ser positivo:
1 1 0 1
1
−
1
0
,
0
1
0
1
0
0
(2
← transportes
0 1 1 1
,
0
1
0
(2
0 1 1 0
,
0
1
0
(2
← Resultado
Representación de la información numérica
114
© FUOC • PID_00153515
Por lo tanto:
10111,010(2 = – 11101100(2 = –0111,010(2 – (–1101100(2) = +0110,010(2 → 0110010(2.
De nuevo, podemos comprobar que el resultado obtenido es correcto si lo convertimos a base 10:
+0110,010(2 = 22 + 21 + 2–2 = 4 + 2 + 0,25 = +6,25(10 = –7,25(10 – (–13,5(10) = –7,25(10 + 13,5(10.
44.
a) En primer lugar, hay que identificar los diferentes elementos que componen este formato:
Signo (S)
Exponente (e)
Mantisa
1
111
0010
• Bit de signo S = 1. Por lo tanto, se trata de un número negativo.
• Exponente. Puesto que la mantisa es de 4 bits, quedan 3 bits (111(2) para el exponente (q = 3).
Por lo tanto, el exceso será M = 2q–1 = 22 = 4(10. Entonces, el exponente vale: e = 111(2 – 4(10 =
= (22 + 21 + 20) – 4 = (4 + 2 + 1) – 4 = 7 – 4 = 3(10.
• Finalmente, los cuatro bits que quedan forman la mantisa que, puesto que está normalizada en la forma 1,X con bit implícito, toma el valor R = 1,0010(2.
Ahora ya podemos calcular el número representado en base 10 aplicando la fórmula ±R · 2e
y el TFN:
–1,0010(2 · 23 = –(20 + 2–3) · 23 = –(23 + 20) = –(8 + 1) = –9(10.
b) En este caso, procedemos de manera totalmente análoga a la del apartado anterior:
Signo (S)
Exponente (e)
Mantisa
0
1010
011
• Bit de signo s = 0. Por lo tanto, se trata de un número positivo.
• Exponente. Dado que la mantisa es de 3 bits, quedan 4 bits (1010(2) para el exponente (q = 4).
Por lo tanto, el exceso será M = 2q–1 = 23 = 8(10. Entonces, el exponente vale e = 1010(2 – 8(10 =
= (23 + 21) – 8 = (8 + 2) – 8 = 10 – 8 = 2(10.
• Finalmente, los cuatro bits que quedan forman la mantisa que, puesto que está normalizada en la forma 1,X con bit implícito, toma el valor R = 1,011(2.
Ahora ya podemos calcular el número representado en base 10 aplicando la fórmula ±R · 2e
y el TFN:
+1,011(2 · 22 = +(20 + 2–2 + 2–3) · 22 = +(22 + 20 + 2–1) = +(4 + 1 + 0,5) = +5,5(10.
45.
a) El formato especificado tiene la forma dada por la siguiente tabla:
Signo (S)
Exponente (e)
Mantisa
1 bit
4 bits
3 bits
En primer lugar, codificaremos la magnitud 1,335(10 en base 2:
• La parte entera es 1(10:
1
=
0·2
+ 1
Es decir, 1(10 = 1(2.
• En lo que respecta a la parte fraccionaria:
0,335
0,67
0,34
0,68
0,36
0,72
·
·
·
·
·
·
2
2
2
2
2
2
=
=
=
=
=
=
0,67
1,34
0,68
1,36
0,72
1,44
=
=
=
=
=
=
0 + 0,67
1 + 0,34
0 + 0,68
1 + 0,36
0 + 0,72
1 + 0,44
Representación de la información numérica
115
© FUOC • PID_00153515
Así pues, 0,355(10 = 0,010101…(2 y nos detenemos, porque ya tenemos bastantes más bits de
los que permite representar este formato.
• Ahora, se juntan las dos partes de la magnitud y obtenemos 1,335(10 = 1,010101(2.
• A continuación, normalizamos la expresión obtenida (añadiendo la información del signo) en la forma ±R · 2e: +1,335(10 = +1,010101(2 · 20.
• Finalmente, obtenemos los diferentes elementos que definen la representación.
– Signo: se trata de un número negativo. Por lo tanto, el bit de signo será un 1.
– Exponente: el exponente es 0(10, que hay que codificar en exceso a M = 2q–1. Puesto
que disponemos de 4 bits, el exceso es M = 23 = 8. Por lo tanto, hay que representar
0(10 + 8(10 = 8(10 con 4 bits:
8
4
2
1
=
=
=
=
4·2
2·2
1·2
0·2
+
+
+
+
0
0
0
1
Es decir, e = 8(10 = 1000(2 (en exceso a 8).
– Mantisa: R = 1,010101(2. Puesto que hay bit implícito (1,X), sólo es necesario representar la parte derecha de la coma y disponemos de 3 bits (con truncamiento). Así
pues, la mantisa serán los tres bits a partir de la coma: 010.
– Ahora ya podemos juntar todas las partes:
Signo (S)
Exponente (e)
Mantisa
1
1000
010
Es decir, la representación es 11000010.
b) La única diferencia con el apartado anterior es el cálculo de la mantisa, porque ahora hay
que redondear en lugar de truncar. Tal y como se indica más arriba, tenemos R = 1,010101(2.
Para redondearlo con tres bits, hay que sumarle la mitad de la precisión y truncar su resultado:
1,010101(2 + 0,0001(2 = 1,011001(2 → truncamos 3 bits → 1,011(2
Por lo tanto, la representación será la siguiente:
Signo (s)
Exponente (e)
Mantisa
1
1000
011
Es decir, la secuencia bits de la representación es 11000011.
c) El formato especificado tiene la forma dada por la siguiente tabla:
Signo (S)
Exponente (e)
Mantisa
1 bit
5 bits
3 bits
En primer lugar, codificaremos la magnitud 10,0327(10 en base 2:
• La parte entera es 10(10:
10
5
2
1
=
=
=
=
5·2
2·2
1·2
0·2
+
+
+
+
0
1
0
1
Es decir, 10(10 = 1010(2.
• En lo que respecta a la parte fraccionaria:
0,0327
0,0654
0,1308
0,2616
0,5232
0,0464
·
·
·
·
·
·
2
2
2
2
2
2
=
=
=
=
=
=
0,0654
0,1308
0,2616
0,5232
1,0464
0,0928
=
=
=
=
=
=
0 + 0,0654
0 + 0,1308
0 + 0,2616
0 + 0,5232
1 + 0,0464
0 + 0,0928
Representación de la información numérica
116
© FUOC • PID_00153515
Así pues, 0,0327(10 = 0,000010...(2 y nos detenemos, porque ya tenemos bastantes más bits
de los que permite representar este formato.
• Ahora, se juntan las dos partes de la magnitud y obtenemos 10,0327(10 = 1010,000010(2.
• A continuación, normalizamos la expresión obtenida (añadiendo la información del signo) en la forma ±R · 2e: +10,0327(10 = +1,010000010(2 · 23.
• Finalmente, obtenemos los diferentes elementos que definen la representación:
– Signo: se trata de un número positivo. De esta manera, el bit de signo será un 0.
– Exponente: el exponente es 3(10, que hay que codificar en exceso a M = 2q–1. Puesto
que disponemos de 5 bits, el exceso es M = 24 = 16. Por lo tanto, hay que representar
3(10 + 16(10 = 19(10 con 4 bits:
19
9
4
2
1
=
=
=
=
=
9·2
4·2
2·2
1·2
0·2
+
+
+
+
+
1
1
0
0
1
Es decir, e = 19(10 = 10011(2 (en exceso a 16).
–
–
Mantisa: R = 1,010000010(2. Puesto que hay bit implícito (1,X), sólo es necesario representar la parte derecha de la coma y disponemos de 3 bits (con truncamiento). De
este modo, la mantisa serán los tres bits a partir de la coma: 010.
Ahora ya podemos juntar todas las partes:
Signo (S)
Exponente (e)
Mantisa
0
10011
010
Es decir, la representación es 010011010.
d) De nuevo, la única diferencia con el apartado anterior es el cálculo de la mantisa, porque
ahora hay que redondear en lugar de truncar. Tal y como se indica más arriba, tenemos R =
1,010000010(2. Para redondearlo con tres bits, hay que sumarle la mitad de la precisión y
truncar su resultado:
1,010000010(2 + 0,0001(2 = 1,010100010(2 truncamos 3 bits 1,010(2
Por lo tanto, la representación será la siguiente:
Signo (S)
Exponente (e)
Mantisa
0
10011
010
Es decir, se obtiene la misma secuencia de bits que en el caso de truncamiento: 010011010.
e) El formato especificado tiene la forma dada por la siguiente tabla:
Signo (S)
Exponente (e)
Mantisa
1 bit
3 bits
4 bits
• En primer lugar, codificaremos la magnitud 2 · 103(10 = 2000(10 en base 2:
2000
1000
500
250
125
62
31
15
7
3
1
=
=
=
=
=
=
=
=
=
=
=
1000
500
250
125
62
31
15
7
3
1
0
·
·
·
·
·
·
·
·
·
·
·
2
2
2
2
2
2
2
2
2
2
2
+
+
+
+
+
+
+
+
+
+
+
0
0
0
0
1
0
1
1
1
1
1
Es decir, 2000(10 = 11111010000(2.
• A continuación, normalizamos la expresión obtenida (añadiendo la información del signo) en la forma ±R · 2e: –2000(10 = –1,1111010000(2 · 210.
Representación de la información numérica
117
© FUOC • PID_00153515
• Finalmente, obtenemos los diferentes elementos que definen la representación.
– Signo: se trata de un número negativo. Por lo tanto, el bit de signo será un 1.
– Exponente: el exponente es 10(10 que hay que codificar en exceso a M = 2q–1. Puesto
que disponemos de 3 bits, el exceso es M = 22 = 4. Por lo tanto, hay que representar
10(10 + 4(10 = 14(10 con 3 bits. Ahora bien, el rango de representación de números naturales con 3 bits es [0, 23 – 1] = [0(10, 7(10] . Por lo tanto, el exponente obtenido
(14(10) no se puede representar en el formato dado. Se produce desbordamiento en
el exponente.
f) El formato especificado tiene la forma dada por la tabla siguiente:
Signo (S)
Exponente (e)
Mantisa
1 bit
4 bits
3 bits
En primer lugar, codificaremos la magnitud 10 · 103(10 = 10000(10 en base 2:
10000
5000
2500
1250
625
312
156
78
39
19
9
4
2
1
=
=
=
=
=
=
=
=
=
=
=
=
=
=
5000
2500
1250
625
312
156
78
39
19
9
4
2
1
0
·
·
·
·
·
·
·
·
·
·
·
·
·
·
2
2
2
2
2
2
2
2
2
2
2
2
2
2
+
+
+
+
+
+
+
+
+
+
+
+
+
+
0
0
0
0
1
0
0
0
1
1
1
0
0
1
Es decir, 10000(10 = 10011100010000(2.
• A continuación, normalizamos la expresión obtenida (añadiendo la información del signo) en la forma ±R · 2e: +10000(10 = +1,00111000100002 · 213.
• Finalmente, obtenemos los diferentes elementos que definen la representación.
– Signo: se trata de un número positivo; por lo tanto, el bit de signo será un 0.
– Exponente: el exponente es 13(10, que hay que codificar en exceso a M = 2q–1. Puesto que
disponemos de 4 bits, el exceso es M = 23 = 8. Por lo tanto, hay que representar 13(10 +
8(10 = 21(10 con 4 bits. Ahora bien, el rango de representación de números naturales con
4 bits es [0, 24 – 1] = [0(10, 15(10]. Por lo tanto, el exponente obtenido (21(10) no se puede
representar en el formato dado. Se produce desbordamiento en el exponente.
g) El formato especificado tiene la forma dada por la siguiente tabla:
Signo (S)
Exponente (e)
Mantisa
1 bit
3 bits
4 bits
En primer lugar, codificaremos la magnitud 2 · 10−6(10 = 0,000002(10 en base 2:
0,000002
0,000004
0,000008
0,000016
0,000032
0,000064
0,000128
0,000256
0,000512
0,001024
0,002048
0,004096
0,008192
0,016384
0,032768
0,065536
0,131072
0,262144
0,524288
0,048576
0,097152
0,194304
0,388608
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
0,000004
0,000008
0,000016
0,000032
0,000064
0,000128
0,000256
0,000512
0,001024
0,002048
0,004096
0,008192
0,016384
0,032768
0,065536
0,131072
0,262144
0,524288
1,048576
0,097152
0,194304
0,388608
0,777216
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
Es decir, 0,000002(10 = 0,0000000000000000001000…(2.
0 + 0,000004
0 + 0,000008
0 + 0,000016
0 + 0,000032
0 + 0,000064
0 + 0,000128
0 + 0,000256
0 + 0,000512
0 + 0,001024
0 + 0,002048
0 + 0,004096
0 + 0,008192
0 + 0,016384
0 + 0,032768
0 + 0,065536
0 + 0,131072
0 + 0,262144
0 + 0,524288
1 + 0,048576
0 + 0,097152
0 + 0,194304
0 + 0,388608
0 + 0,777216
Representación de la información numérica
118
© FUOC • PID_00153515
• A continuación, normalizamos la expresión obtenida (añadiendo la información del signo) en la forma ±R · 2e: +0,000002(10 = +1,00002 · 2–19 .
• Finalmente, obtenemos los diferentes elementos que definen la representación.
– Signo: se trata de un número positivo, por lo tanto, el bit de signo será un 0.
– Exponente: el exponente es –19(10, que hay que codificar en exceso a M = 2q–1. Dado que
disponemos de 3 bits, el exceso es M = 22 = 4. Por lo tanto, se debe representar –19(10 +
4(10 = –15(10 con 3 bits. Ahora bien, el rango de representación de números naturales con
3 bits es [0, 23 – 1] = [0(10, 7(10] . Así pues, el exponente obtenido (–19(10) no se puede
representar en el formato dado. Se produce desbordamiento a cero del exponente.
Hay que tener presente que, en la práctica, muchos formatos de coma flotante (como por
ejemplo el estándar IEEE754) introducen codificaciones reservadas para el número 0. En este
caso, cuando se produce desbordamiento a cero del exponente, se acostumbra a aproximar
el valor que se quiere representar para la codificación reservada al 0. También se puede elegir
la representación del menor número positivo o del mayor número negativo representable (si
alguna de estas opciones produce un error menor que el que se comete al aproximar por 0).
En este ejercicio, sin embargo, al no haber una codificación reservada para el 0, el número
está fuera del rango y, por lo tanto, no es representable en el formato especificado.
h) El formato especificado tiene la forma dada por la tabla siguiente:
Signo (S)
Exponente (e)
Mantisa
1 bit
4 bits
3 bits
En primer lugar, codificaremos la magnitud 0,0001233(10 en base 2:
0,0001233
0,0002466
0,0004932
0,0009864
0,0019728
0,0039456
0,0078912
0,0157824
0,0315648
0,0631296
0,1262592
0,2525184
0,5050368
0,0100736
0,0201472
0,0402944
0,0805888
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
·
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
2
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
0,0002466
0,0004932
0,0009864
0,0019728
0,0039456
0,0078912
0,0157824
0,0315648
0,0631296
0,1262592
0,2525184
0,5050368
1,0100736
0,0201472
0,0402944
0,0805888
0,1611776
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
=
0 + 0,0002466
0 + 0,0004932
0 + 0,0009864
0 + 0,0019728
0 + 0,0039456
0 + 0,0078912
0 + 0,0157824
0 + 0,0315648
0 + 0,0631296
0 + 0,1262592
0 + 0,2525184
0 + 0,5050368
1 + 0,0100736
0 + 0,0201472
0 + 0,0402944
0 + 0,0805888
0 + 0,1611776
Es decir, 0,0001233(10 = 0,0000000000001000…(2.
• A continuación, normalizamos la expresión obtenida (añadiendo la información del signo) en la forma ±R · 2e: –0,0001233(10 = –1,00002 · 2–13 .
• Finalmente, obtenemos los diferentes elementos que definen la representación.
– Signo: se trata de un número negativo; por lo tanto, el bit de signo será un 1.
– Exponente: el exponente es –13(10, que hay que codificar en exceso a M = 2q–1. Puesto
que disponemos de 4 bits, el exceso es M = 23 = 8. Por lo tanto, hay que representar –
13(10 + 8(10 = –5(10 con 3 bits. Ahora bien, el rango de representación de números naturales con 4 bits es [0, 24 – 1] = [0(10, 15(10] . De este modo, el exponente obtenido (–13(10)
no se puede representar en el formato dado. Se produce desbordamiento a cero del
exponente.
Los mismos comentarios del apartado anterior se aplican también en este ejercicio.
46.
a) El número representado es el 1,010(2 · 20. En esta situación, el próximo número representable es el 1,011(2 · 20 y, por lo tanto, la precisión es la diferencia entre los dos números:
0,001(2 · 20 = 2–3 = 0,125(10. Esta expresión responde a la fórmula 2–k · 2e que tenéis en el
subapartado 2.4.2 de este módulo.
El error de representación es la distancia entre el número representado y el número que queríamos
representar. El número representado es 1,010(2 · 20 = (1 · 20 + 1 · 2–2) · 20 = (1 + 0,25) · 1 = 1,25(10,
y el número que se quería representar es 1,335(10. Por lo tanto, el error cometido en la representación es ⏐1,335(10 − 1,25(10⏐ = 0,085(10.
b) El número representado es el 1,011(2 · 20. Al aplicar la fórmula 2–k · 2e se obtiene que la
precisión es 2−3 · 20 = 2−3 = 0,125(10.
Representación de la información numérica
119
© FUOC • PID_00153515
El error de representación es la distancia entre el número representado y el número que queríamos representar. El número representado es 1,011(2 · 20 = (1 · 20 + 1 · 2–2 + 1 · 2–3) · 20 =
= (1 + 0,25 + 0,125) · 1 = 1,375(10, y el número que se quería representar es 1,335(10. Por lo
tanto, el error cometido en la representación es ⏐1,335(10 − 1,375(10⏐ = 0,040(10. Se puede
comprobar que el error obtenido con redondeo es menor que el obtenido con truncamiento
(apartado anterior).
c) El número representado es el 1,010(2 · 23. Al aplicar la fórmula 2–k · 2e se obtiene que la
precisión es 2–3 · 23= 20 = 1(10.
El error de representación es la distancia entre el número representado y el número que queríamos representar. El número representado es 1,010(2 · 23 = (1 · 20 + 1 · 2–2) · 23 = 23 + 21 = 8
+ 2 = 10(10, y el número que se quería representar es 10,0327(10. Por lo tanto, el error cometido
en la representación es ⏐10,0327(10 − 10(10⏐ = 0,0327(10.
d) El resultado obtenido con redondeo es el mismo que el obtenido con truncamiento. Por
lo tanto, la solución dada en el apartado anterior también es válida para este apartado.
e) Puesto que el número no es representable en el formato dado, no se puede calcular ni la
precisión ni el error de representación.
f) Puesto que el número no es representable en el formato dado, no se puede calcular ni la
precisión ni el error de representación.
g) Puesto que el número no es representable en el formato dado, no se puede calcular ni la
precisión ni el error de representación.
h) Puesto que el número no es representable en el formato dado, no se puede calcular ni la
precisión ni el error de representación.
47.
a) El formato especificado tiene la forma dada por la siguiente tabla:
Signo (S)
Exponente (e)
Mantisa
1 bit
5 bits
10 bits
El número mayor que se puede representar es aquel que tiene signo positivo (0) y el resto de
los bits a 1:
Signo (S)
Exponente (e)
Mantisa
0
11111
1111111111
El número representado es el siguiente:
• Exponente: el exceso será M = 2q–1 = 24 = 16(10. Entonces, el exponente vale e = 11111(2 –
– 16(10 = (24 + 23 + 22 + 21 + 20) – 16 = (16 + 8 + 4 + 2 + 1) – 16 = 31 – 16 = 15(10.
• La mantisa está normalizada en la forma 1, X con bit implícito y toma el valor
R = 1,1111111111(2 = 2 0 + 2 –1 + ... + 2–10 = 2 1 – 2–10 = 2 – 2–10.
• Por tanto, el mayor número que se puede representar es (2 – 2–10) · 215 = 215 – 25 = 65536 – 32 =
= +65504(10.
b) El formato especificado tiene la forma dada por la siguiente tabla:
Signo (S)
Exponente (e)
Mantisa
1 bit
6 bits
3 bits
El mayor número que se puede representar es aquel que tiene signo positivo (0) y el resto de
los bits a 1:
Signo (S)
Exponente (e)
Mantisa
0
111111
111
El número representado es el siguiente:
• Exponente: el exceso será M = 2q–1 = 25 = 32(10. Entonces, el exponente vale e = 111111(2 – 32(10 =
= (25 + 24 + 23 + 22 + 21 + 20) – 32 = (32 + 16 + 8 + 4 + 2 + 1) – 32 = 63 – 32 = 31(10.
Representación de la información numérica
120
© FUOC • PID_00153515
• La mantisa está normalizada en la forma 1,X con bit implícito y toma el valor R = 1,111 (2 =
= 20 + 2–1 + 2–2 + 2–3 = 21 – 2–3 = 2 – 2–3.
• Por lo tanto, el mayor número que se puede representar es (2 – 2 –3) · 231 = 2 32 – 2 28 =
= 4294967296 – 268435456 = +4026531840(10 = +4,026531840(10 · 109.
48. El formato especificado tiene la forma dada por la siguiente tabla:
Signo (S)
Exponente (e)
Mantisa
1 bit
5 bits
10 bits
Y sabemos que el rango de representación de los formatos de coma flotante es el siguiente:
[–(2 – 2–k) · 2M–1, –2–M ] ∪ [+2–M, +(2 – 2–k) · 2M–1]
Hay que comprobar que el número 2,89(10 · 1010 no pasa del límite superior de los números
positivos representables. Por lo tanto, tenemos que evaluar el número (2 – 2–k) · 2M–1 y comprobar a qué valor decimal corresponde. Para esto, es necesario determinar los valores de k y
M. Puesto que tenemos un formato con 10 bits de mantisa normalizada en la forma 1,X y bit
implícito, k (el número de bits de la parte fraccionaria) es igual a 10. Por otro lado, el exceso
de la representación del exponente es M = 2q–1 y q = 5 (el número de bits del exponente). Por
lo tanto, M = 24 = 16(10. Así pues:
(2 – 2–k) · 2M–1 = (2 – 2–10) · 216–1 = (2 – 2–10) · 215 = (216 – 25) = 65536 – 32 = 65504(10.
Dado que 2,89(10 · 1010 > 65504(10 podemos concluir que este número no es representable
en el formato dado.
49. El formato específico tiene la forma dada por la tabla siguiente:
Signo (s)
Exponente (e)
Mantisa
1 bit
6 bits
3 bits
Y sabemos que el rango de representación de los formatos de coma flotante es el siguiente:
[–(2 – 2–k) · 2M–1, –2–M ] ∪ [+2–M, +(2 – 2–k) · 2M–1]
Es necesario comprobar que el número –1256(10 · 10–2 = –12,56(10 está dentro del rango de los
números negativos representables, es decir, [–(2 – 2–k) · 2M–1, –2–M ]. Por este motivo, hay que
determinar los valores de k y M. Puesto que tenemos un formato con 3 bits de mantisa normalizada en la forma 1,X y bit implícito, k (el número de bits de la parte fraccionaria) es igual
a 3. Por otro lado, el exceso de la representación del exponente es M = 2q–1 y q = 6 (el número
de bits del exponente). Por lo tanto, M = 25 = 32(10. Así pues:
–2–M = –2–32 ≈ –2,328306437(10 · 10–10
–(2 – 2–k) · 2M–1 = –(2 – 2–3) · 232–1 = –(2 – 2–3) · 231 = –(232 – 228) =
= –4294967296 + 268435456 = –4026531840(10 = –4,026531840(10 · 109
Por lo tanto, dado que –12,56(10 ∈ [–2,328306437(10 · 10–10, –4,026531840(10 · 109], hay que
comprobar si éste es uno de los números representables de este formato en este intervalo.
Para hacerlo, calculamos la representación de este valor en el formato especificado en el
enunciado. En primer lugar, codificaremos la magnitud 12,5(10 en base 2.
• La parte entera es 12(10:
12
6
3
1
=
=
=
=
6·2
3·2
1·2
0·2
+
+
+
+
0
0
1
1
Es decir, 12(10 = 1100(2.
• Por lo que respecta a la parte fraccionaria:
0,56
0,12
0,24
0,48
0,96
0,92
·2
·2
·2
·2
·2
·2
=
=
=
=
=
=
1,12
0,24
0,48
0,96
1,92
1,84
=
=
=
=
=
=
1 + 0,12
0 + 0,24
0 + 0,48
0 + 0,96
1 + 0,92
1 + 0,84
Representación de la información numérica
121
© FUOC • PID_00153515
Así pues, 0,56(10 = 0,100011...(2 y nos detenemos porque ya tenemos muchos más bits de los
que permite representar este formato.
• Ahora, se juntan las dos partes de la magnitud y obtenemos 12,56(10 ≈ 1100,100011(2.
• Seguidamente, normalizamos la expresión obtenida (añadiendo la información del signo)
en la forma ±R · 2e: –12,56(10 ≈ –1,100100011(2 · 23.
• Finalmente, obtenemos los diferentes elementos que definen la representación:
– Signo: se trata de un número negativo, por lo tanto, el bit de signo será un 1.
– Exponente: El exponente es 3(10 que hay que codificar en exceso a M = 2q–1. Dado que disponemos de 6 bits, el exceso es M = 25 = 32. Por lo tanto, hay que representar 3(10 + 32(10
= 35(10 con 6 bits:
1
+
2
17 ·
=
35
1
+
2
8 ·
=
17
0
+
2
4 ·
=
8
0
+
2
2 ·
=
4
0
+
2
1 ·
=
2
1
+
2
0 ·
=
1
Es decir e = 35(10 = 100011(2 (en exceso a 32).
– Mantisa: R = 1,100100011(2. Como hay bit implícito (1,X), sólo hay que representar la parte de la derecha de la coma y disponemos de 3 bits (con truncamiento). Así, la mantisa
serán los tres bits a partir de la coma: 100.
– Ahora ya podemos juntar todas las partes:
Signo (S)
Exponente (e)
Mantisa
1
100011
100
Es decir, la representación es 1100011100.
Al haber tenido que truncar la mantisa, podemos concluir que el número –12,56(10 no se puede representar en el formato dado, sino que hay que aproximarlo (en este caso, la aproximación se ha hecho por el truncamiento).
50.
a) El formato especificado tiene la forma dada por la tabla siguiente:
Signo (S)
Exponente (e)
Mantisa
1 bit
5 bits
10 bits
Y sabemos que el rango de representación de los formatos de coma flotante es el siguiente:
[–(2 – 2–k) · 2M–1, –2–M ] ∪ [+2–M, +(2 – 2–k) · 2M–1]
Dado que tenemos un formato con 10 bits de mantisa normalizada en la forma 1,X y bit implícito, k (el número de bits de la parte fraccionaria) es igual a 10. Por otro lado, el exceso de
la representación del exponente es M = 2q–1 y q = 5 (el número de bits del exponente). Por lo
tanto, M = 24 = 16(10. Así pues:
2–M = 2–16 = 1,52587890625(10 · 10–5
(2 – 2–k) · 2M–1 = (2 – 2–10) · 216–1 = (2 – 2–10) · 215 = (216 – 25) = 65536 – 32 = 65504(10
Por lo tanto, el rango de representación es el siguiente:
[–65504(10, –1,52587890625(10 · 10–5] ∪ [+1,52587890625(10 · 10–5, 65504(10]
b) El formato especificado tiene la forma dada por la tabla siguiente:
Signo (S)
Exponente (e)
Mantisa
1 bit
6 bits
3 bits
Y sabemos que el rango de representación de los formatos de coma flotante es el siguiente:
[–(2 – 2–k) · 2M–1, –2–M ] ∪ [+2–M, +(2 – 2–k) · 2M–1]
Representación de la información numérica
122
© FUOC • PID_00153515
Puesto que tenemos un formato con 3 bits de mantisa normalizada en la forma 1,X y bit implícito, k (el número de bits de la parte fraccionaria) es igual a 3. Por otro lado, el exceso de
la representación del exponente es M = 2q–1 y q = 6 (el número de bits del exponente), y por
lo tanto, M = 25 = 32(10. Así pues:
2–M = 2–32 ≈ 2,328306437(10 · 10–10
(2 – 2–k) · 2M–1 = (2 – 2–3) · 232–1 = (2 – 2–3) · 231 = (232 – 228) = 4294967296 – 268435456 =
=4026531840(10 = 4,026531840(10 · 109
Por lo tanto, el rango de representación es el siguiente:
[–4,026531840(10 · 109, –2,328306437(10 · 10–10]
∪
[+2,328306437(10 · 10–10, +4,026531840(10 · 109]
51.
a) 00110010 + 00110101
Primero descodificaremos los dos números. Empezamos por 00110010. En primer lugar, hay
que identificar los distintos elementos que componen este formato.
Signo (S)
Exponente (e)
Mantisa
0
01100
10
• Bit de signo S = 0, por lo tanto, se trata de un número positivo.
• Exponente: tenemos q = 5 (5 bits para el exponente). Por lo tanto, el exceso será M = 2q–1 =
= 24 = 16(10. Entonces, el exponente vale e = 01100(2 – 16(10 = (23 + 22) – 16 = (8 + 4) – 16 =
= 12 – 16 = –4(10.
• Finalmente, los dos bits que quedan forman la mantisa que, puesto que está normalizada
en la forma 1,X con bit implícito, toma el valor R = 1,10(2.
• Por lo tanto, se trata del número +1,10(2 · 2–4.
En lo que respecta al segundo sumando, tenemos lo siguiente:
Signo (S)
Exponente (e)
Mantisa
0
01101
01
• Bit de signo S = 0, por lo tanto, se trata de un número positivo.
• Exponente: el exponente vale e = 01101(2 – 16(10 = (23 + 22 + 20) – 16 = (8 + 4 +1) – 16 =
= 13 – 16 =–3(10.
• Finalmente, los dos bits que quedan forman la mantisa que, puesto que está normalizada
en la forma 1,X con bit implícito, toma el valor R = 1,01(2.
• Por lo tanto, se trata del número +1,01(2 · 2–3.
Así pues, hay que hacer la suma 1,10(2 · 2–4 + 1,01(2 · 2–3. En primer lugar, es necesario igualar
los exponentes al mayor de los dos (–3):
1,10(2 · 2–4 → 0,110(2 · 2–3
Ahora ya se puede proceder a calcular la suma:
1
+
1
← transportes
1
–3
0 ,
1
1
0
(2
2
1 ,
0
1
0
(2
2–3
1 1 ,
0
0
0
(2
2–3
← resultado
El resultado es +10,000(2 · 2–3, que hay que normalizar en la forma ±1,X · 2e: +1,0000(2 · 2–2 y
representar en el formato especificado en el enunciado:
• Bit de signo S = 0, porque se trata de un número positivo.
Representación de la información numérica
123
© FUOC • PID_00153515
• El exponente vale –2(10 que, expresado en exceso a 16(10, es e = –2(10 + 16(10 = 14(10. Para
representarlo en base 2 aplicamos el método de las divisiones sucesivas:
14
7
3
1
=
=
=
=
7
3
1
0
·
·
·
·
2
2
2
2
+
+
+
+
0
1
1
1
Es decir, el exponente es 1110(2 y, para completar los 5 bits, hay que añadir un cero a la izquierda: 01110(2.
• En lo que respecta a la mantisa, tenemos R = 1,1000(2. Puesto que hay bit implícito (1,X),
sólo es necesario representar la parte de la derecha de la coma y disponemos de 2 bits (con
truncamiento, porque el enunciado no especifica lo contrario). Así pues, la mantisa serán
los dos primeros bits a partir de la coma: 10.
• Al juntar todas las partes, se obtiene la siguiente representación:
Signo (S)
Exponente (e)
Mantisa
0
01110
10
Es decir, en la representación dada 00110010 + 00110101 = 01111000.
b) 10100101 + 10100100
Procedemos como en el apartado anterior y descodificaremos los dos números. Empezamos
por 10100101. En primer lugar, hay que identificar los diferentes elementos que componen
este formato.
Signo (s)
Exponente (e)
Mantisa
1
01001
01
• Bit de signo S = 1; por lo tanto, se trata de un número negativo.
• Exponente: e = 01001(2 – 16(10 = (23 + 20) – 16 = (8 + 1) – 16 = 9 – 16 = –7(10.
• Finalmente, los dos bits que quedan forman la mantisa que, puesto que está normalizada
en la forma 1,X con bit implícito, toma el valor R = 1,01(2.
• Por lo tanto, se trata del número –1,01(2 · 2–7.
En lo que respecta al segundo sumando, tenemos lo siguiente:
Signo (S)
Exponente (e)
Mantisa
1
01001
00
• Bit de signo S = 1; por lo tanto, se trata de un número negativo.
• Exponente: e = 01001(2 – 16(10 = (23 + 20) – 16 = (8 + 1) – 16 = 9 – 16 = –7(10.
• Finalmente, los dos bits que quedan forman la mantisa que, puesto que está normalizada
en la forma 1,X con bit implícito, toma el valor R = 1,00(2.
• Por lo tanto, se trata del número –1,00(2 · 2–7.
Así pues, hay que hacer la suma –1,01(2 · 2–7 + (–1,00(2 · 2–7). Dado que los exponentes son
iguales, se puede proceder a hacer la suma directamente:
← transportes
1
−
1 ,
0
1
(2
· 2–7
+ −
1 ,
0
0
(2
· 2–7
− 1 0 ,
0
1
(2
· 2–7
← resultado
El resultado es –10,01(2 · 2–7, que hay que normalizar en la forma ±1,X · 2e: –1,001(2 · 2–6 y
representar en el formato especificado en el enunciado:
• Bit de signo S = 1, porque se trata de un número negativo.
Representación de la información numérica
124
© FUOC • PID_00153515
Representación de la información numérica
• El exponente vale –6(10 que, expresado en exceso a 16(10, es e = –6(10 + 16(10 = 10(10. Para
representarlo en base 2, aplicamos el método de las divisiones sucesivas:
10
5
2
1
=
=
=
=
5
2
1
0
·
·
·
·
2
2
2
2
+
+
+
+
0
1
0
1
Es decir, el exponente es 1010(2 y, para completar los 5 bits, hay que añadir un cero a la
izquierda: 01010(2.
• En lo que respecta a la mantisa, tenemos R = 1,001(2. Puesto que hay bit implícito (1,X),
sólo se debe representar la parte de la derecha de la coma y disponemos de 2 bits (con truncamiento, porque el enunciado no especifica lo contrario). Así pues, la mantisa será los
primeros dos bits a partir de la coma: 00.
• Al juntar todas las partes, se obtiene la representación siguiente:
Signo (S)
Exponente (e)
Mantisa
1
01010
00
Es decir, en la representación dada 10100101 + 10100100 = 10101000.
c) 11110010 + 10111011
Aplicamos el mismo método que en los apartados anteriores. Empezamos por descodificar
11110010. En primer lugar, hay que identificar los diferentes elementos que componen este
formato:
Signo (S)
Exponente (e)
Mantisa
1
11100
10
• Bit de signo S = 1; por lo tanto, se trata de un número negativo.
• El exponente vale e = 11100(2 – 16(10 = (24 + 23 + 22) – 16 = (16 + 8 + 4) – 16 = 12(10.
• Finalmente, los dos bits que quedan forman la mantisa que, puesto que está normalizada
en la forma 1,X con bit implícito, toma el valor R = 1,10(2.
• Por lo tanto, se trata del número –1,10(2 · 212.
En lo que respecta al segundo sumando, tenemos lo siguiente:
Signo (S)
Exponente (e)
Mantisa
1
01110
11
• Bit de signo S = 1; por lo tanto, se trata de un número negativo.
• Exponente: el exponente vale e = 01110(2 – 16(10 = (23 + 22 + 21) – 16 = (8 + 4 + 2) – 16 =
14 – 16 = –2(10.
• Finalmente, los dos bits que quedan forman la mantisa que, dado que está normalizada
en la forma 1,X con bit implícito, toma el valor R = 1,11(2.
• Por lo tanto, se trata del número –1,11(2 · 2–2.
Así pues, hay que hacer la suma –1,10(2 · 212 + (–1,11(2 · 2–2). En primer lugar, es necesario
igualar los exponentes al mayor de los dos (12):
1,11(2 · 2–2 = 0,0111(2 · 20 = 0,0000000000000111(2 · 212
Ahora ya se puede proceder a calcular la suma:
← transportes
–
212
1 , 1 0
+ –
0 , 0 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
(2
212
–
1 , 1 0 0 0 0 0 0 0 0 0 0 0 0 1 1 1
(2
212
← resultado
El resultado es –1,1000000000000111(2 · 212, que ya está normalizado en la forma ±1,X · 2e y
hay que representarlo en el formato especificado en el enunciado:
• Bit de signo S = 1, porque se trata de un número negativo.
125
© FUOC • PID_00153515
• El exponente vale 12(10 que, expresado en exceso a 16(10, es e = 12(10 + 16 (10 = 28 (10 =
= 11100(2. Dado que se trata del mismo valor que teníamos para el primer sumando, no
hay que aplicar el método de divisiones sucesivas, sino que tenemos directamente la representación en base 2.
• En lo que respecta a la mantisa, tenemos R = 1,1000000000000111(2. Dado que hay bit implícito (1,X), sólo es necesario representar la parte de la derecha de la coma y disponemos
de 2 bits (con truncamiento, porque el enunciado no especifica lo contrario). Así pues, la
mantisa serán los dos primeros bits a partir de la coma: 10.
• Al juntar todas las partes, se obtiene la siguiente representación:
Signo (S)
Exponente (e)
Mantisa
1
11100
10
Es decir, en la representación dada 11110010 + 10111011 = 111110010. Observemos que el
resultado de la suma es idéntico al primer sumando. Esto es habitual en formatos de coma
flotante cuando uno de los dos sumandos tiene una magnitud mucho mayor que el otro.
52. Para empaquetar, sólo hay que agrupar los bits de 4 en 4 y hacer su cambio de base a
hexadecimal. En este caso, tenemos los grupos 1011 | 0001:
1011(2 = B(16
0001(2 = 1(16
Ahora, agrupamos todos estos dígitos en una única cadena y obtenemos 10110001(2 → B1h.
53. Procedemos de manera análoga al ejercicio anterior, agrupando los bits de 4 en 4: 0100 |
0001 | 1111 | 1010 y haciendo el cambio de base de cada grupo:
0100(2 = 4(16
0001(2 = 1(16
1111(2 = F(16
1010(2 = A(16
Ahora, agrupamos todos estos dígitos en una sola cadena y obtenemos 0100000111111010(2→
→ 41FAh.
Observad que no hemos hecho un cambio de base del número fraccionario representado por
la cadena de bits original, sino que hemos empaquetado los bits de una manera en la que
resulta más cómodo trabajar.
54. En primer lugar, codificaremos el número 1,125(10 en base 2:
• La parte entera es 1(10 = 1(2:
1
=
0·2
+
1
• En lo que respecta a la parte fraccionaria:
0,125
0,25
0,5
·2
·2
·2
=
=
=
0,25
0,5
1,0
=
=
=
0 + 0,25
0 + 0,5
1+0
Así pues, 0,125(10 = 0,001(2.
• Ahora, se juntan las dos partes de la magnitud y obtenemos 1,125(10 = 1,001(2 que, representado con 8 bits para la parte fraccionaria y 4 para la parte entera, es 1,001(2 =
0001,00100000(2 (hemos añadido tres ceros a la izquierda de la parte entera y cinco ceros
a la derecha de la parte fraccionaria). Así pues, en el formato especificado en el enunciado
tenemos la secuencia de bits 000100100000(2.
Para empaquetarla en hexadecimal, hay que agrupar los bits de 4 en 4: 0001 | 0010 | 0000 y
hacer el cambio de base para cada grupo:
0001(2 = 1(16
0010(2 = 2(16
0000(2 = 0(16
Ahora, agrupamos todos estos dígitos en una única cadena y obtenemos 000100100000(2 →
→ 120h.
De nuevo, hay que comentar que no hemos hecho un cambio de base, porque claramente
1,125(10 ≠ 120(16.
Representación de la información numérica
126
© FUOC • PID_00153515
55. En primer lugar, tomamos cada uno de los dígitos que forman la cadena y obtenemos su
codificación binaria:
A(16 = 1010(2
8(16 = 1000(2
3(16 = 0011(2
56. A continuación, montamos una sola cadena de bits juntando los tres grupos obtenidos: A83h 101010000011(2. Si interpretan esta cadena de bits como un número natural, podemos calcular su valor decimal aplicando el TFN: 101010000011(2 = 211 + 29 + 27 + 21 + 20 =
2048 + + 512 + 128 + 2 + 1 = 2691(10.
57. Del ejercicio anterior, ya sabemos que A83h → 101010000011(2. Si interpretan esta cadena de bits como un número de coma flotante de 12 bits, con la mantisa normalizada de la
forma 1,X, bit implícito y 4 bits para el exponente, tenemos lo siguiente:
Signo (S)
Exponente (e)
Mantisa
1
0101
0000011
Por lo tanto, podemos obtener el valor decimal como sigue.
• Bit de signo S = 1; por lo tanto, se trata de un número negativo.
• Exponente: tenemos 4 bits para el exponente (q = 4). Por lo tanto, el exceso será M = 2q–1
= 23 = 8(10. Entonces, el exponente vale e = 0101(2 – 8(10 = (22 + 20) – 8 = (4 + 1) – 8 = 5 – 8
= –3(10.
• Finalmente, los 7 bits que quedan forman la mantisa que, puesto que está normalizada en
la forma 1,X con bit implícito, toma el valor R = 1,0000011(2.
Ahora ya podemos calcular el número representado en base 10 aplicando la fórmula ±R ·
2e y el TFN:
–1,0000011(2 · 2–3 = –(20 + 2–6 + 2–7) · 2–3 = –(2–3 + 2–9 + 2–10) = –0,1279296875(10.
57. En primer lugar, tomamos cada uno de los dígitos que forman la cadena y obtenemos su
codificación binaria:
B(16 = 1011(2
5(16 = 0101(2
A continuación, montamos una única cadena de bits juntando los dos grupos obtenidos:
B5h→ 10110101(2. Si interpretamos esta cadena como un número entero codificado en exceso a 10(10, tenemos que 10110101(2 = X + 10(10; por lo tanto:
X = 10110101(2 – 10(10 = (27 + 25 + 24 + 22 + 20) – 10 = (128 + 32 + 16 + 4 + 1) – 10 =
= 181 – 10 = 171(10.
Es decir, la cadena representa el número 171(10.
58. En primer lugar, codificamos en binario con 4 bits cada uno de los dígitos del número:
1(10 = 0001(2
2(10 = 0010(2
5(10 = 0101(2
Y finalmente, formamos una única tira con todos los bits 000100100101(2.
59. Como en el apartado anterior, en primer lugar codificamos en binario con cuatro bits
cada uno de los dígitos del número:
6(10 = 0110(2
3(10 = 0011(2
7(10 = 0111(2
Y finalmente, formamos una única tira con todos los bits 011000110111(2.
60. Separamos la tira de bits en grupos de 4 y comprobamos qué número decimal representan. Tenemos 000100111000(2 → 0001 | 0011 | 1000; por lo tanto:
0001(2 = 1(10
0011(2 = 3(10
1000(2 = 8(10
Y finalmente, construimos el número decimal juntando los dígitos decimales: 138(10.
Representación de la información numérica
127
© FUOC • PID_00153515
61. Para codificar 427(10 en BCD, primero codificamos en binario con 4 bits cada uno de los
dígitos del número:
4(10 = 0100(2
2(10 = 0010(2
7(10 = 0111(2
Y por último, formamos una sola tira con todos los bits 010000100111(2.
Para codificar el mismo número en binario, es necesario aplicar el método de las divisiones
sucesivas por la base de llegada (2):
427
213
106
53
26
13
6
3
1
=
=
=
=
=
=
=
=
=
213
106
53
26
13
6
3
1
0
·2
·2
·2
·2
·2
·2
·2
·2
·2
+
+
+
+
+
+
+
+
+
1
1
0
1
0
1
0
1
1
Por lo tanto, 427(10 = 110101011(2.
En el caso de la codificación BCD, se necesitan 12 bits para representar el número 427(10. En
cambio, la codificación binaria sólo necesita 9.
Ejercicios de autoevaluación
1. Para codificar el −10(10, aplicaremos primero el procedimiento de divisiones sucesivas para
pasar a base 2 el módulo del número (10).
10
5
2
1
=
=
=
=
5
2
1
0
·2
·2
·2
·2
+
+
+
+
0
1
0
0
Por lo tanto, 10(10 = 1010(2.
Si ahora queremos codificar el −10(10, lo que haremos será aplicar la operación de complemento sobre el módulo con los 8 bits de la representación final:
0 0 0 0 1 0 1 0 ←valor numérico inicial
← transporte
1
1 1 1 1 0 1 0 1 ←complemento bit a bit de la expresión inicial
1 ←sumamos 1 al bit menos significativo del formato
+
1 1 1 1 0 1 1 0
Por lo tanto, −10(10 codificado en complemento a 2 y 8 bits es 11110110(2.
Para conseguir la codificación en signo y magnitud, sólo hay que codificar el signo (1, ya que
es negativo) y añadir la magnitud representada en 7 bits. De esta manera, el número −10(10
codificado en signo y magnitud es 10001010(2.
Para codificar el −10(10 en exceso a 128(10 será necesario codificar el −10(10 + 128(10 = 118(10.
El 118(10 en binario lo encontramos si aplicamos el algoritmo de divisiones sucesivas:
118
59
29
14
7
3
1
=
=
=
=
=
=
=
59
29
14
7
3
1
0
·2
·2
·2
·2
·2
·2
·2
+
+
+
+
+
+
+
0
1
1
0
1
1
1
Por lo tanto, 118(10 = 1110110(2 . Consiguientemente, −10(10 codificado en exceso a 128 es
01110110(2.
2.
a) Si se trata de un número en complemento a 2, sabemos que el número es positivo, ya que
el primer dígito es 0. Por lo tanto, sólo habrá que aplicar el TFN para conocer el módulo:
Representación de la información numérica
128
© FUOC • PID_00153515
00100100(2 = 25 + 22 = 36(10. Si está codificado el complemento a 2, el número representado
es el +36(10.
b) Si se trata de un número codificado en signo y magnitud, es un número positivo, ya que
el primer dígito corresponde al signo y es cero. El resto de los dígitos codifican la magnitud
en binario que podemos pasar a base 10 si aplicamos el TFN: 0100100(2 = 25 + 22 = 36(10. Por
lo tanto, el número codificado en signo y magnitud es el +36(10. Podemos ver que coincide
con la interpretación en Ca2. Esto se debe a que se trata de un número positivo. Los números
positivos presentan la misma codificación en signo y magnitud que en Ca2.
c) Si se trata de un número codificado en exceso a 128(10 y queremos conocer el valor decimal
que representa, debemos hacer la siguiente operación:
00100100(2 − 128(10 = 00100100(2 − 10000000(2 = 36(10 − 128(10 = −92(10
Por lo tanto, el número codificado es −92(10.
3.
← transportes
1 1 1
1 1 1 0 1 0 1 0 1 1 0 0
(2
+ 1 1 1 1 0 0 0 0 1 0 0 1 0
(2
1 1 1 0 0 1 0 1 1 1 1 1 0
(2
← resultado
↑
desbordamiento
Como se puede observar, se produce un fenómeno de desbordamiento. Por lo tanto, el resultado no se puede almacenar en el número de bits disponibles. El resultado es incorrecto.
4. Para codificar este número, aplicaremos el procedimiento de divisiones sucesivas primero
para la parte entera y después para la parte fraccionaria.
12 = 6 · 2 + 0
16 = 3 · 2 + 0
13 = 1 · 2 + 1
11 = 0 · 2 + 1
Por lo tanto, 12(10=1100(10
0,346 · 2 = 0,692 = 0,692 + 0
0,692 · 2 = 1,384 = 0,384 + 1
0,384 · 2 = 0,768 = 0,768 + 0
0,768 · 2 = 1,536 = 0,536 + 1
Por lo tanto, 0,346(10 = 0,0101…(2.
Finalmente, si juntamos las dos partes obtenemos: 12,346(10 = 1100,0101…(2. Puesto que sólo
se dispone de tres dígitos para la parte fraccionaria, y se utiliza una aproximación por truncamiento: 12,346(10 = 1100,010(2.
El número +12,346(10 codificado en el formato indicado es 01100010.
5. El formato especificado tiene la forma dada por la siguiente tabla:
Signo (S)
Exponente (e)
Mantisa
1 bit
4 bits
3 bits
• Codificaremos la magnitud 12,346(10 en base 2. Como se puede ver en la solución de la
actividad 4 de autoevaluación, 12,346(10 = 1100,0101... (2.
• A continuación, normalizamos la expresión obtenida (añadiendo la información del signo) en la forma ±R · 2e: +12,346(10 +1,1000101(2 · 23.
• Finalmente, obtenemos los distintos elementos que definen la representación.
– Signo: se trata de un número negativo. Por lo tanto, el bit de signo será un 0.
Representación de la información numérica
129
© FUOC • PID_00153515
– Exponente: el exponente es 3(10, que hay que codificar en exceso a M = 2q–1. Ya que disponemos de 4 bits, el exceso es M = 23 = 8. Por lo tanto, hay que representar 3(10 + 8(10 = 11(10 con
4 bits:
11
=
5·2
+
1
5
2
=
=
2·2
1·2
+
+
1
0
1
=
0·2
+
1
Es decir, e = 11(10 = 1011(2 (en exceso a 8).
– Mantisa: R = 1,1000101(2. Puesto que hay bit implícito (1,X), sólo es necesario representar
la parte derecha de la coma y disponemos de 3 bits (con truncamiento). Así pues, la mantisa serán los tres bits a partir de la coma: 100.
– Ahora ya podemos juntar todas las partes:
Signo (S)
Exponente (e)
Mantisa
0
1011
100
Es decir, la representación es 01011100.
6. Para codificar un número en BCD, debemos codificar cada dígito decimal en cuatro dígitos
binarios. Si juntamos las codificaciones, conseguimos la representación en BCD:
1(10 = 0001(2
7(10 = 0111(2
8(10 = 1000(2
Y finalmente, el número 178(10 codificado en BCD es 000101111000(2.
7. En primer lugar, desempaquetaremos el número y convertiremos cada dígito hexadecimal
en cuatro dígitos binarios:
378 = 001101111000(2
En segundo lugar, hay que identificar los diferentes elementos que componen este formato:
Signo (S)
Exponente (e)
Mantisa
0
0110111
1000
– Bit de signo S = 0; por lo tanto, se trata de un número negativo.
– Exponente: puesto que la mantisa es de 4 bits, quedan 7 bits (0110111(2) para el exponente
(q = 7). Por lo tanto, el exceso será M = 2 q–1 = 26 = 64 (10. Entonces, el exponente vale
e = 0110111(2 – 64(10 = (25 + 24 + 22 + 21 + 20) – 64 = (32 + 16 + 4 + 2 + 1) – 64 = 55 – 64 = – 9(10.
– Finalmente, los cuatro bits que quedan forman la mantisa que, puesto que está normalizada en la forma 1,X con bit implícito, toma el valor R = 1,1000(2.
– Ahora, ya podemos calcular el número representado en base 10 aplicando la fórmula ±R ·
2e y el TFN:
–1,1000(2 · 2−9 = –(20 + 2–1) · 2−9 = –(2−9 + 2−10) = –(0,001953125 + 0,0009765625) =
= –0,0029296875(10.
8. Para codificar el número −45(10 en complemento a 2 es necesario, en primer lugar, expresar
en binario el módulo (45(10). Esto lo conseguiremos si aplicamos el algoritmo de divisiones
sucesivas:
45 = 22 · 2 + 1
22 = 11 · 2 + 0
11 = 15 · 2 + 1
15 = 12 · 2 + 1
12 = 11 · 2 + 0
11 = 10 · 2 + 1
Representación de la información numérica
130
© FUOC • PID_00153515
Por lo tanto, 45(10 = 101101(2. Puesto que el número −45(10 es negativo, se deberá representar
en 8 bits la magnitud positiva y hacer un cambio de signo:
0 0 1 0 1 1 0 1 ← valor numérico inicial
1 1 0 1 0 0 1 0 ← complemento bit a bit de la expresión inicial
+
1 ← sumamos 1 al bit menos significativo del formato
1 1 0 1 0 0 1 1
El número −45(10 codificado en complemento a 2 es 11010011(2.
Para empaquetar esta cadena de bits, debemos hacer grupos de 4 bits y después codificarlos
en hexadecimal.
1101(2 = D(16
0011(2 = 3(16
Finalmente, el número codificado y empaquetado en hexadecimal es D3(16.
9. Lo primero que haremos será codificar en binario el número. Lo haremos con el algoritmo
de divisiones sucesivas, por separado en la parte entera y la fraccionaria:
35 = 17 · 2 + 1
17 = 18 · 2 + 1
18 = 14 · 2 + 0
14 = 12 · 2 + 0
12 = 11 · 2 + 0
11 = 10 · 2 + 1
Por lo tanto, 35(10 = 100011(2
0,25 2 =
0,5 2 =
0,5
1,0
=
=
0,5
0
+
+
0
1
Por lo tanto, 0,25(10 = 0,01 (2
Si juntamos las dos partes, obtenemos: 35,25(10 = 100011,01(2.
Para representar la parte entera necesitamos 6 bits, y para representar la parte fraccionaria son
necesarios 2 bits. Además, necesitamos un bit para representar el signo. Por lo tanto, serán necesarios nueve dígitos, de los cuales dos se tienen que destinar a la parte fraccionaria. El número
codificado en este formato es: 110001101(2.
9. Lo primero que haremos será codificar en binario los números que nos han dado. Lo haremos con el algoritmo de divisiones sucesivas. Primero lo aplicaremos sobre la parte entera,
y después sobre la parte fraccionaria.
12 = 6 · 2 + 0
16 = 3 · 2 + 0
13 = 1 · 2 + 1
11 = 0 · 2 + 1
Por lo tanto, 12(10=1100 (2
0,25 · 2 = 0,5 = 0,5 + 0
0,5 · 2 = 1,0 = 0 + 1
Por lo tanto, 0,25(10 = 0,01(2. Y si juntamos las dos partes, obtenemos: 12,25(10 = 1100,01(2.
Finalmente, si añadimos el bit de signo (que es cero) y la magnitud en 8 bits de los cuales 2
son fraccionarios, tenemos:
+12,25(10 = 0001100,01(2
32 = 16 · 2 + 0
16 = 18 · 2 + 0
18 = 14 · 2 + 0
14 = 12 · 2 + 0
12 = 11 · 2 + 0
11 = 10 · 2 + 1
Representación de la información numérica
131
© FUOC • PID_00153515
Por lo tanto, 32(10=100000(2
0,5 · 2 = 1,0 = 0,0 + 1
Por lo tanto, 0,5(10 = 0,1 (2. Y si juntamos las dos partes, obtenemos: 32,5(10 = 100000,1(2. Finalmente, si añadimos el bit de signo (que es cero) y la magnitud en 8 bits de los cuales dos
son fraccionarios, tenemos:
+32,5(10 = 0100000,10(2
Ahora hacemos la operación de suma:
← transportes
+
0 1 0 0 0 0 0 , 1 0
(2
0 0 0 1 1 0 0 , 0 1
(2
1 1 0 1 0 0 0 , 1 1
(2
← resultado
Puesto que no hay desbordamiento, el resultado de la suma es correcto.
Glosario
base f Número de dígitos distintos en un sistema de numeración.
BCD m Véase decimal codificado en binario.
binario m Sistema de numeración en base 2.
binary coded decimal m Véase decimal codificado en binario.
sigla BCD
bit m Abreviación de binary digit (‘dígito binario’). Corresponde a la menor unidad de información posible. Se define como la cantidad de información asociada a la respuesta de una
pregunta formulada de una manera no ambigua, en la que sólo son posibles dos alternativas
de respuesta y que, además, tienen la misma probabilidad de ser elegidas.
bit menos significativo m Bit menos significativo (más a la derecha) de una representación numérica posicional.
en less significant bit
sigla LSB
borrow m Transporte usado en la operación de resta.
byte m Véase octeto.
cadena f Conjunto de elementos de un mismo tipo dispuestos uno a continuación del otro.
carry m Véase transporte.
coma fija f Sistema de representación numérica que utiliza un número fijo de dígitos enteros y fraccionarios.
coma flotante f Sistema de representación numérica que codifica un número variable de
dígitos enteros y fraccionarios. La cantidad de dígitos enteros y fraccionarios depende del formato y del valor numérico que se representa.
decimal m Sistema de numeración en base 10.
decimal codificado en binario m Codificación de los dígitos decimales (0,1,2, …, 9) sobre un conjunto de cuatro dígitos binarios.
en binary coded decimal
sigla BCD
desbordamiento m Indicación de que el resultado de una operación queda fuera del rango
de representación disponible.
en overflow
digital m Sistema que trabaja con datos discretos.
Representación de la información numérica
© FUOC • PID_00153515
132
dígito m Elemento de información que puede tomar un número finito de valores distintos.
El número de valores diferentes es determinado por la base de numeración.
empaquetamiento m Transformación que permite representar la información binaria de
una manera más compacta.
formato m Descripción estructural de una secuencia de datos, donde se especifica el tipo,
la longitud y la disposición de cada elemento.
fraccionario m Menor que la unidad.
hexadecimal m Sistema de numeración en base 16.
less significant bit m Véase bit menos significativo.
LSB m Véase bit menos significativo.
MSB m Véase bit más significativo.
octal m Sistema de numeración en base 8.
octeto m Cadena de 8 bits.
en byte
overflow m Véase desbordamiento.
palabra f Unidad de información procesada por un computador de una sola vez (en paralelo).
en word
precisión f Diferencia entre dos valores consecutivos de una representación.
raíz f Base de un sistema de numeración.
rango m Conjunto de valores que indican los márgenes entre los cuales están los valores posibles de un formato de representación.
representación f Véase formato.
transporte m Bit que indica que se ha superado el valor b de la base de numeración al
sumar dos dígitos. La suma de dos valores numéricos se lleva a cabo dígito a dígito, progresando de derecha a izquierda. Un transporte, al sumar dos dígitos, indica que hay que añadir una unidad al hacer la suma de los dos dígitos siguientes.
en carry
word m Véase palabra.
Bibliografía
Miguel, P. de (1996). Fundamentos de los computadores (5.ª ed., cap. 2). Madrid: Paraninfo.
Patterson, D.; Henessy, J. L. (1995). Organización y diseño de computadores: la interfaz
hardware/software. Madrid: McGraw-Hill.
Stallings, W. (1996). Organización y arquitectura de computadores: diseño para optimizar prestaciones. Madrid: Prentice Hall.
Representación de la información numérica
Descargar