1
Datos escalares y compuestos
Sección 5.1-5.3
2
Objeto de datos
Objetos de datos escalares:
• Numérico (Integers, Real)
• Boléanos
• Caracteres
• Enumeraciones
Objetos compuestos:
• Cadenas (String)
• Puntero (Pointer)
Objetos estructurados:
• Arreglos (Arrays)
• Registros (Records)
• Listas (Lists)
• Conjuntos (Sets)
Tipos de datos
abstractos:
•Clases
Objetos activos:
•Tareas (Tasks)
•Procesos (Processes)
3
Unión de objetos de datos
Un compilador crea dos clases de objetos:
• Posiciones de memoria
• Valores numéricos
Una variable es la unión (binding) de un nombre con una
posición de memoria:
• Contenido de la posición puede cambiar
4
Tipos de datos
Cada objeto de datos tiene un tipo:
Valores: para objetos de ese tipo
Operaciones: para objetos de ese tipo
Implementación: (Representación de almacenamiento) para
objetos de ese tipo
Atributos: (p.eje. nombre) para objetos de ese tipo
Firma: (de operaciones de f): f: tipo x tipo tipo
5
L-value y R-value
Posición de un objeto es
su L-value. Contenidos de
esa posición es su R-value.
¿Porque los nombres L-value y R-value?
Considere ejecutar: A = B + C;
1. Coja el contenido de posición B
2. Sume el contenido de posición C
3. Almacene el resultado en la dirección A.
Para cada objeto nombrado, su posición en el lado
derecho del operador de asignación (=) es un acceso al
contenido de , y su posición en el lado izquierdo del
operador de asignación es el acceso a la dirección de.
• dirección de entonces es un L-value
• Contenido de entonces es un R-value
• Valor, por si solo, generalmente significa R-
value
6
Subtipos
A es un subtipo de B si todo valor de A es un valor de
B.
Nota: In C casi todo es un subtipo de integer.
Conversión entre tipos:
¿Dado dos variables A y B, cuando es A:=B legal?
Explicito: Todas las conversiones entre diferentes
tipos debe ser especificado
Implícito: Algunas conversiones entre diferentes tipos
están implícitas en la definición del lenguaje.
7
Ejemplos de coerción
Ejemplos en Pascal:
var A: real;
B: integer;
A := B - Implícito, denominado una coerción – una
conversión automática de un tipo a otro tipo
A := B es llamada ampliación (widening) por cuanto el
tipo A tiene más valores que B.
B := A (si fuera permitido) sería llamado contracción
(narrowing) ya que B tiene menos valores que A.
Información se pierde en este caso.
En la mayoría de los lenguajes se permite coerción de
ampliación;
Coerciones de contracción deben ser explicitas:
B := round(A); El entero más cercano a A
B := trunc(A); Borrar la parte fraccional de A
8
Datos númericos enteros
Enteros:
Representación binaria
en aritmética de
complemento a 2
Para palabras de 32-bits:
Valor máximo:
231-1
Valor mínimo:
-231
Valores positivos Valores Negativos
9
Datos numéricos reales
Float (real): representación de hardware
Exponentes usualmente desplazados
ejemplo, si 8 bits (256 valores)+128 sumados al
exponente
• exponente de 128 = 128-128 = 0 es el verdadero
exponente
• exponente de 129 = 129-128 = 1 es el verdadero
exponente
• exponente de 120 = 120-128 = -8 es el exponente
10
Formato de punto flotante IEEE
IEEE standard 754 especifica 32- y 64-bit standard.
Números consisten de tres campos:
S: campo de bit de signo. 0 es positivo.
E: exponente en notación de exceso de -127. Valores (8
bits) van de 0 a 255, correspondiendo a exponentes de
2 que van de -127 a 128.
M: mantisa de 23 bits. Debido a que el primer bit de la
mantisa en un número normalizado es 1, puede ser
omitido e insertado automáticamente por el hardware,
dando un 24avo bit adicional de precisión.
11
Decodificación del formato
Dado E, y M, el valor de la representación es:
Parámetros Valor
E=255 y M 0 Un número invalido
E=255 y M = 0
0<E<255 2{E-127}(1.M)
E=0 y M 0 2 {-126}.M
E=0 y M=0 0
12
Ejemplo de número de punto flotante
+1= 20*1= 2{127-127}*(1).0 (binario) 0 01111111 000000...
+1.5= 20*1.5= 2{127-127}*(1).1 (binario) 0 01111111 100000...
-5= -22*1.25= 2{129-127}*(1).01 (binario)1 10000001 010000...
• Esto da un rango desde 10-38 a 1038.
• En formato de 64 bits,el exponente es extendido a 11
bits dando un rango desde -1022 a +1023, con números en
el rango de 10-308 a 10308.
13
Otros datos numéricos
Entero corto (C) - 16 bit, 8 bit
Entero largo (C) - 64 bit
Booleano o lógico - 1 bit con valor verdadero o falso
Byte - 8 bits
Carácter – Un byte - 256 caracteres
• ASCII es un código de 7 bits 128 caracteres
En C, una variable tipo char es simplemente un dato
numérico entero de 8 bits
14
Enumeraciones
typedef enum cosas {A, B, C, D } NuevoTipo;
• Implementado como enteros pequeños con valores:
A = 0, B = 1, C = 2, D = 3
• NuevoTipo X, Y, Z;
X = A
¿Por que no escribir: X=0 en vez de X=A?
• Facilidad de lectura
• Detección de error
Ejemplo:
enum { electrica, mecanica, maritima, geologia}
ClaseFacultad;
enum { viejo,nuevo } CalidadPan;
CalidadPan = fresco; Un error que puede ser detectado
15
Declarando datos decimales
Decimal fijo en PL/I y COBOL (Para aplicaciones financieras)
DECLARE X FIXED DECIMAL(p,q);
p = número de dígitos decimales
q = número de dígitos en la fracción
Ejemplo de decimal fijo en PL/I:
DECLARE X FIXED DECIMAL (5,3),
Y FIXED DECIMAL (6,2),
Z FIXED DECIMAL (6,1);
X = 12.345;
Y = 9876.54;
16
Usando datos decimales
¿Que es Z=X+Y?:
Realizando la operación manualmente, alineamos el punto
decimal y sumamos:
0012.345
9876.540
9888.885 = FIXED DECIMAL(8,3)
p=8 debido a que al sumar dos números de 4 dígitos puede dar
un resultado de 5 dígitos y se necesitan 3 lugares para la
parte fraccional.
p=8 y q=3 es conocido antes de la suma
• Conocido durante la compilación - No se requiere pruebas
en ejecución.
17
Implementando datos decimales
Algoritmo:
1. Almacene cada número como un entero (12345, 987654)
El compilador conoce el factor de escala (S=3 para
X, S=2 para Y).
Valores verdaderos impresos dividiendo el entero
almacenado por 10S
2. Para sumar, alinee el punto decimal. Ajuste S en 1
multiplicando por 10.
3. 10*Y+X = 9876540 + 12345 = 9888885, Compilador
conoce S=3
4. S=1 para Z, por lo que se necesita ajustar S en la
suma en 2; divida por 102 (98888)
5. Almacene 98888 en Z. Compilador conoce S=1
Nota: S nunca aparece en memoria y no hay perdida de
exactitud al almacenar datos como enteros.
18
Datos compuestos
Cadena de caracteres: Objeto primitivo hecho de datos
de caracteres más primitivos.
Longitud fija:
char A(10) - C
DCL B CHAR(10) - PL/I
var C packed array [1..10] of char - Pascal
Longitud variable:
DCL D CHAR(20) VARYING - PL/I - 0 a 20 caracteres
E = “ABC” - SNOBOL4 – cualquier tamaño, dinámico
F = `ABCDEFG\0' - C – cualquier tamaño, definido por
el programador
19
Implementación de cadenas
20
Operaciones en cadenas
En C, arreglos y cadenas de caracteres son lo mismo.
Implementación:
L-value(A[I]) = L-value(A[0]) + I
21
Punteros
Uso de punteros para crear estructuras de datos
arbitrarios
Cada puntero puede apuntar a un objeto de otra
estructura de datos
De manera general es muy tendiente a errores y debe ser
evitado
22
Asignación con punteros
Top Related