PDA

Ver la Versión Completa : ¿Cuántos bytes tiene un real?


kakarotv5
16-06-2007, 00:42:44
Tras ver la asignatura de Estructura y Tecnología de Computadores (como ya sabeis en ella se ve a fondo el funcionamiento de un computador, nosotros más en concreto vimos el Motorola 68000) he comprendido del todo la razón de los tipos de datos Byte y Word de Pascal / Object Pascal, por ello me ha picado el gusanillo y he empezado a hacer esto:

Byte [0,255] => Como su nombre indica está formado por un byte (por tanto tenemos 8 bits para el número por lo que el número más alto será (2^8)-1 = 255).

Word [0,65535] => Como su nombre tiene una longitud de una palabra, es decir, dos bytes (por tanto tenemos 16 bits para el número por lo que el número más alto será (2^16)-1 = 65535).

Char [0,255] => Por lo que deduzco es un byte ya que un caracter ASCII ocupa un byte.
Ejemplo: la letra A es el número 41 en hexadecimal, como 41 tiene dos cifras ocupa un byte.

ShortInt [-128,127] => Por lo que deduzco es un byte (como hay signo un bit se usa para tal efecto con lo que tenemos 7 bits para el número por tanto el número más alto será (2^7)-1 = 127).

Integer [-32768,32767] => Por lo que deduzco que está formado por dos bytes (como hay signo un bit se usa para tal efecto con lo que tenemos 15 bits para el número por tanto el número más alto será (2^15)-1 = 32767).

LongInt [-2147483646,2147483647] => Por lo que deduzco que está formado por cuatro bytes (como hay signo un bit se usa para tal efecto con lo que tenemos 31 bits para el número por tanto el número más alto será (2^31)-1 = 2147483647).

¿Y el tipo de dato real? Este (y los demás que son en punto flotante) me descoloca, no se cuantos bytes tiene ni como expresar el número más alto de la forma 2^numero_bits - 1, lo único que se es que tiene este rango 1E-38 a 1E+38. No he trabajado con números decimales en ensamblador.

Saludos.

seoane
16-06-2007, 01:05:31
No te calientes la cabeza, la función Sizeof te devuelve el tamaño en bytes de cualquier variable, o tipo. Por ejemplo:

ShowMessage(IntToStr(Sizeof(Real)));


Y sino también puedes mirar la ayuda:

Type Range digits Size in bytes
Real48 2.9 x 10^-39 .. 1.7 x 10^38 11-12 6
Single 1.5 x 10^-45 .. 3.4 x 10^38 7-8 4
Double 5.0 x 10^-324 .. 1.7 x 10^308 15-16 8
Extended 3.6 x 10^-4951 .. 1.1 x 10^4932 19-20 10


Es mejor que te acostumbres a usar Sizeof, porque a veces pasan cosas curiosas como esta:

var
Ejemplo: record
i: Integer;
b: byte;
end;
begin
ShowMessage(IntToStr(Sizeof(Ejemplo)));
end;

Según la tabla anterior el tamaño del record debería de ser de 5 bytes, pero sin embargo como veras en el mensaje es de 8. Esto es debido a la "optimización" que realiza el compilador. Y sin embargo:

var
Ejemplo: packed record
i: Integer;
b: byte;
end;
begin
ShowMessage(IntToStr(Sizeof(Ejemplo)));
end;

Ahora el record si que mide 5 bytes, curioso ¿verdad?

kakarotv5
16-06-2007, 11:43:49
Muchas gracias.