Está en la página 1de 9

Prog rama de E xpo sic io n

1 Presentación
2 Objetivos
3 La estructura de la Memoria de un
computador.
4 Números Enteros
5 Números Reales
6 Representación de Números
7 Representación de un Numero Entero
8 Método de Complemento Doble
9 Representación de un numero real
10Conclusión
11Preguntas y Respuestas.
12Ejercicio.
Representación de números en el computador

Objetivos: Mostrar la representación de los números en base 2, tanto para números


enteros como para números reales.

Temas:

• La estructura de la memoria del computador.


• Representación de enteros.
• Representación de reales en punto fijo.
• Representación de reales en punto flotante.
• Precisión.
• Error de representación.

La estructura de la memoria del computador

Los números se almacenan en las variables. Una variable representa un trozo de la


memoria del computador. La memoria está formada por una gran cantidad de bytes y
cada byte está constituido por 8 bits. Un bit puede almacenar un 1 o un 0.

Un computador tiene por ejemplo 32 mega bytes de memoria (MB). Esto significa que
tiene 32*1024*1024 bytes (o 32*1024*1024*8 bits). A principios de los 80s, los PCs
tenían muy poca memoria: 64 kilo bytes (KB), es decir 64*1024 bytes. En computación
los kilos corresponden a 1024 (y no 1000) y los megas a 1024 kilos. Esto se debe a que es
más fácil construir computadores que tengan una capacidad de memoria que sea múltiplo
de 1024 o 1024*1024.

Los enteros

Una variable entera (int) está formada por 4 bytes, es decir 32 bits. Estos 32 bits
representan el valor almacenado por esa variable en binario. Por ejemplo:

El valor representado por esta variable es:

1*2^2 + 0*2^1 + 1*2^0


En donde x^y se usa acá como una abreviación de x elevado a y.
En general, una variable entera x está formada por 32 bits que denotaremos x31, x30, ... ,
x2, x1 y x0. El valor numérico representado por la variable x está dado por el siguiente
cálculo:

• Si x31 es 0, el valor es positivo y se calcula como:


• x31*2^31 + x30*2^30 + ... + x2*2^2 +x1*2^1+ x0*2^0
• Si x31 es 1, el valor es negativo y se calcula construyendo una nueva palabra y, tal
que:
• yi= 1 si xi==0
• 0 si xi==1

• valor(x) = - (valor(y) + 1)

Se dice que y es el complemento de x.

Ejemplos:

• valor(000...001001) = 1*2^3+1*2^0= 9
• valor(111...111010) = - (valor(000...000101)+1) = - (5+1) = -6

Una variable entera (int) siempre utiliza 32 bits, aún cuando el número sea pequeño. Por
otra parte, no es capaz de almacenar números demasiado grandes (en valor absoluto).

Valores máximos y mínimos

Máximo= valor(011...111111)= 2^31-1


Mínimo= valor(100...000000)= -2^31

Por lo tanto, con un int se pueden almacenar números de 9 dígitos aproximadamente.

Tarea: juegue con el programa Jalisco ingresando los números 2147483646 y


2147483647. ¡Explique qué sucedió!

Ejercicios:

• ¿Qué número representa el siguiente número en binario 000...00101011?


• ¿y el 111...101001?
• ¿Cómo se representa en el computador el número 23?
• ¿y el -35?

Observación: usualmente se usa el tipo int para almacenar enteros, pero también existen
otros tipos que también almacenan enteros pero en menos o más bits. La siguiente tabla
muestra los tipos enteros presentes en Java:
tipo número rango
de bits representado
int 32 [-2^31,2^31-1]
short 16 [-2^15,2^15-1]
byte 8 [-2^7,2^7-1]
long 64 [-2^63,2^63-1]

Los reales

Una variable real (double) está formada por 8 bytes, es decir el doble de un entero. En
ella se almacenan números reales en formato binario. Por ejemplo, el número:

1101.1010

representa en decimal al número:

2^3 + 2^2 + 2^0 + 2^(-1) + 2^(-3) = 8+4+1+0.5+0.125

Los primeros computadores almacenaban los números reales en una formato llamado
punto fijo, en donde se destinaba una cantidad fija de bits para la parte entera (por
ejemplo 32 bits) y el resto a la parte fraccionaria. Por lo tanto, el número anterior sería
representado en 64 bits como:

00000000 00000000 00000000 00001101 . 10100000 00000000 00000000 00000000

En esta representación, el punto que separa la parte entera de la parte fraccionaria,


siempre se ubica en una posición fija y de ahí el nombre de esta representación.

El problema de esta representación es que el rango de valores representables es el mismo


de los números enteros. Se necesitaba un mecanismo que aumentara el rango de números
representables. La forma de hacerlo fue destinar una parte de los bits a indicar la posición
del punto. Y este formato paso a llamarse punto flotante.

Representación en punto flotante

Un número real se almacena en una variable especificando 3 componentes: el signo (+ o


-), la mantisa y el exponente. Por ejemplo, el número 11 se representa como:

• el signo: +
• mantisa: 10110000...
• exponente: 4

La mantisa es una secuencia de bits que siempre comienza en 1. El exponente indica en


donde colocar el punto que separa la parte entera de la fraccionaria. Un valor 0 indica que
el punto se coloca justo antes del primer bit. Un valor 4 indica que se coloca después del
cuarto bit. Un valor -3 indica que hay que imaginar que el número va precedido por 0.000
y luego viene la mantisa.
¿Qué número es el siguiente?

• el signo: -
• mantisa: 110010000...
• exponente: 7

Solución: -1100100.00... , que es -(4+32+64)= -100

Otros ejemplos:

signo mantisa exponente en binario en decimal


+ 1000... 100 1 seguido 2^99
de 99 ceros
+ 1010... 0 0.1010 0.5+0.125 (0.625)
+ 1000... -3 0.0001 2^(-4) (0.0625)

En una variable de tipo double se destina 1 bit para el signo, 11 bits para el exponente y
52 bits para la mantisa.

Valores máximos y mínimos

Máximo en valor absoluto: 2^1023


Valor más pequeño: 2^(-1024)

La ventaja de esta representación es que se alcanza un rango de representación mucho


más grande de lo que sería posible con 64 bits.

Precisión y error de representación

La desventaja es que los números se almacenan con una precisión limitada. Esto significa
que un número que requiera 100 bits de mantisa será aproximado a uno que solo ocupa
52, introduciéndose entonces un error de representación.

El error que se comente se puede visualizar mejor en base 10. El error que comete es
como cuando el siguiente número:

1234567890123456789012345678901234567890

se aproxima al siguiente valor:

123456789012345*10^25

Es decir, solo se reprentan 15 dígitos de los 40 iniciales. El error absoluto que se comete
es:
6789012345678901234567890

que parece enorme, pero lo que importa es el error relativo que es ~10^(-15) que es
bajísimo y para la mayoría de las aplicaciones numéricas es insignificante. Pero es un
error que conviene tener presente.

Observación: además del tipo double existe el tipo float

tipo tamaño mantisa exponente rango precisión


en bits en bits en bits representado en dígitos
double 64 52 11 ~ [-10^300,10^300] ~ 15
float 32 24 7 ~ [-10^33,10^33] ~7
Conceptos esenciales de este capítulo que Ud. debe comprender:

• El rango de representación de los enteros es limitado. Si el resultado de una


operación aritmética (como la multiplicación) excede el rango de representación
se producirá un error en la magnitud del valor almacenado. Lamentablemente,
Java no alerta cuando se comete este tipo de errores.
• El rango de representación de los reales es casi ilimitado, pero los números se
almacenan con una precisión limitada (15 dígitos para una variable de tipo
double). Esto hace que al realizar multiplicaciones y divisiones, los valores que
se obtienen poseen un error de precisión, que no es relevante para la mayoría de
las aplicaciones numéricas.

Tarea opcional:

Muestre que el número 0.3 no es representable en forma exacta en una variable de tipo
double.

Indicación:

Para obtener la representación de un número en el rango [0,1[ como 0.6875 proceda de la


siguiente forma:

• 0.6875 multiplicado por 2 da: 1.375.


• La parte entera es el primer bit del número en base 2. El número será entonces
0.1... Quédese sólo con la parte fraccional de 1.375.
• 0.375 multiplicado por 2 da: 0.75.
• La parte entera es el segundo bit, por lo que queda como 0.10...
• 0.375 multiplicado por 2 da: 1.5.
• La parte entera es el tercer bit, por lo que queda como 0.101... Quédese sólo con
la parte fraccional de 1.5.
• 0.5 multiplicado por 2 da: 1.
• La parte entera es el cuarto bit, por lo que queda como 0.1011... Quédese sólo con
la parte fraccional de 1.0.
• El número que queda es 0, por lo que 0.6875 en base 2 es 0.1011.

Aplique este mismo método para 0.3 y deduzca la forma final del número en base 2.

Representación de un número en un ordenador

Representar (o codificar) un número significa expresarlo en forma binaria. La


representación de números en un ordenador es necesaria para que éste pueda
almacenarlos y manipularlos. Sin embargo, el problema es que un número matemático
puede ser infinito (tan grande como se desee), pero la representación de un número en un
ordenador debe ocupar un número de bits predeterminado. Por lo tanto, la clave es
predeterminar un número de bits y cómo se interpretan para que representen la cifra de la
manera más eficiente posible. Por este motivo, sería tonto codificar un carácter utilizando
16 bits (65.536 posibilidades) cuando se utilizan menos de 256.

Representación de un número natural

Un número natural es un número entero positivo o cero. La elección de la cantidad de bits


a utilizar depende del intervalo de números que se utilizarán. Para codificar los números
naturales entre 0 y 255, todo lo que se necesita son 8 bits (un byte) como 28=256. Por lo
general, la codificación de un bit n se puede utilizar para representar números naturales
entre 0 y 2n-1.

Para representar un número natural, una vez definido el número de bits se utilizarán para
su codificación, ordene los bits en celdas binarias (cada bit ubicado de acuerdo a su peso
binario en el orden de derecha a izquierda) y luego "llene" los bits que no se utilizan con
ceros.

Representación de un número entero

Un número entero es un número completo que puede ser negativo. Por lo tanto, el
número se debe codificar de manera que se pueda distinguir si es positivo o negativo y de
forma que siga las reglas de adición. El truco consiste en utilizar un método denominado
complemento doble.

• Un número entero o ce ro se representará en base binaria (base 2) como un número natural, con la
excepción de que el bit de mayor peso (aquel que se encuentra más a la izquierda) representa el signo
más o menos. Por lo tanto, para un número entero o cero, este bit se debe establecer en 0 (lo que
corresponde al signo más, así como 1 es el signo menos). De este modo, si un número natural se
codifica utilizando 4 bits, el mayor número posible será 0111 (o 7 en base decimal).
Generalmente, el mayor número entero posible codificado utilizando n bits será 2n-1-1.
• Un número entero negati vo se codifica utilizando complementos dobles.
El principio de los complementos dobles:
Se elige un número negativo.
o Se toma su valor absoluto (su equivalente positivo)
o Se representa en base binaria utilizando n-1 bits
o Cada bit se cambia con su complemento (es decir, los ceros se reemplazan con unos y
viceversa)
o Se suma 1

Nótese que al sumar un número y sus complementos dobles es resultado es 0

Veamos esto con un ejemplo:


Queremos codificar el valor 5 utilizando 8 bits. Para hacer esto:

• escriba el 5 en sistema binario 00000101


• cámbielo por su complemento 11111010
• sume 1: 11111011
• la representación binaria en 8 bits de 5 es 11111011

Co men ta ri os:
El bit de mayor peso es 1, de manera que es, de hecho, un número negativo.
Si sumamos 5 y -5 (00000101 y 11111011) la suma da 0 (con el remanente 1).

Representación de un número real

El objetivo es representar un número con un punto decimal en sistema binario (por


ejemplo, 101.01, que no se lee ciento uno punto cero uno ya que es, de hecho, un número
binario, 5,25 en sistema decimal) mediante el formato 1.XXXXX... * 2n (en nuestro
ejemplo, 1.0101*22). El estándar IEEE 754 define cómo codificar un número real.
Este estándar ofrece una forma de codificar un número utilizando 32 bits, y define tres
componentes:

• el signo más/menos se representa por un bit: el bit de mayor peso (aquel que se encuentra más a la
izquierda)
• el exponente se codifica utilizando 8 bits inmediatamente después del signo
• la mantisa (los bits después del punto decimal) con los 23 bits restantes

Así, la codificación sigue la forma:


seeee eeeemm mm mm mm mm mm mm mm mm mm mm m

• la s representa al bit del signo.


• cada e representa al exponente del bit
• cada m representa a la mantisa del bit

Sin embargo, hay ciertas restricciones para los exponentes:

• el exponente 00000000 está prohibido


• el exponente 11111111 está prohibido. Sin embargo, a veces se utiliza para informar de errores. Esta
configuración numérica se denomina NaN (Not a number), que significa No es un número.
• Se le debe sumar 127 (01111111) al exponente para convertir al decimal en un número real dentro del
sistema binario. Por lo tanto, los exponentes pueden variar de -254 a 255

Así, la fórmula para expresar números reales es:

(-1)^S * 2^( E - 127 ) * ( 1 + F )


donde:

• S es el bit del signo y, por lo tanto, 0 se entiende como positivo ( -1^0=1 ).


• E es el exponente al que se le debe sumar 127 para obtener el equivalente codificado
• F es la parte de la fracción, la única que se expresa, y la que se le suma a 1 para realizar el cálculo.

Aquí hay un ejemplo:


Se codificará el valor 525,5.

• 525,5 es positivo, por lo que el primer bit será 0.


• Su representación en el sistema binario (base 2) es: 1000001101.1
• Al normalizarlo, obtenemos: 1.0000011011*2^9
• Sumándole 127 al exponente, que es 9, da 136 o, en sistema binario (base 2): 10001000
• La mantisa está compuesta por la parte decimal de 525,5 en base 2 normal, que es 0000011011.
• Como la mantisa debe tomar 23 bits, se deben agregar ceros para completarla:
00000110110000000000000
• La representación binaria de 525,5 bajo el estándar IEEE 754 es, por lo tanto:
0 1000 1000 00000110110000000000000
0100 0100 0000 0011 0110 0000 0000 0000 (4403600 en sistema hexadecimal)

A continuación hay otro ejemplo, esta vez utilizando un número real negativo :
Se codificará el valor -0,625.

• El bit s es 1, como 0,625 es negativo.


• 0,625 se escribe en sistema binario (base 2) de la siguiente manera: 0.101
• Queremos escribirlo en la forma 1.01 x 2-1
• Consecuentemente, el exponente vale 1111110 como 127 - 1 = 126 (o 1111110 en sistema binario)
• La mantisa es 01000000000000000000000 (sólo se representan los dígitos después del punto decimal,
ya que el número entero es siempre equivalente a 1)
• La representación binaria de 0,625 bajo el estándar IEEE 754 es, por lo tanto:
1 1111 1110 01000000000000000000000
1111 1111 0010 0000 0000 0000 0000 0000 (FF 20 00 00 en sistema hexadecimal)

Última actualización el jueves, 16 de octubre de 2008, 15:43:30 .