0% encontró este documento útil (0 votos)
33 vistas32 páginas

Eda 1

El documento describe las tres etapas del proceso de compilación en C: preprocesamiento, compilación y enlace. En la primera etapa se eliminan comentarios y se incluyen archivos. En la segunda etapa se verifica la sintaxis y genera código objeto. En la tercera etapa se une el código objeto con bibliotecas para generar el ejecutable. El documento también explica la representación de datos primitivos como enteros y reales en memoria.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
0% encontró este documento útil (0 votos)
33 vistas32 páginas

Eda 1

El documento describe las tres etapas del proceso de compilación en C: preprocesamiento, compilación y enlace. En la primera etapa se eliminan comentarios y se incluyen archivos. En la segunda etapa se verifica la sintaxis y genera código objeto. En la tercera etapa se une el código objeto con bibliotecas para generar el ejecutable. El documento también explica la representación de datos primitivos como enteros y reales en memoria.
Derechos de autor
© © All Rights Reserved
Nos tomamos en serio los derechos de los contenidos. Si sospechas que se trata de tu contenido, reclámalo aquí.
Formatos disponibles
Descarga como PDF, TXT o lee en línea desde Scribd
Está en la página 1/ 32

Estructura de Datos y

Algoritmos I
Ing. Patricia Del Valle Morales
M en C Gabriel Castillo Hernández
Proceso de compilación
en C
El compilador del lenguaje C/C++ ejecuta tres etapas desde que se recibe el código fuente (ejemplo.c)
hasta que se tiene el código ejecutable (ejemplo.exe), listo para correr:

Ing. Patricia Del Valle Morales, M. en C. Gabriel Castillo Hernández 3


proceso completo de compilación

Ing. Patricia Del Valle Morales, M. en C. Gabriel Castillo Hernández 4


La salida de este primer paso es un archivo fuente modificado: no contiene comentarios ni sentencias
tales como #define #include #ifdef, etc. Esta primera etapa no verifica sintaxis, únicamente realiza
modificaciones al código fuente. Llamemos a esta salida el archivo $$$.c

Ing. Patricia Del Valle Morales, M. en C. Gabriel Castillo Hernández 5


En esta etapa se toma la salida de la primera etapa ($$$.c) y se compila el código, durante el proceso se
verifica la sintaxis del programa y se generan los errores y las advertencias.

La salida es un archivo con código binario (código objeto) pero incapaz de correr, debido principalmente a
que aún falta información para completar el programa

Ing. Patricia Del Valle Morales, M. en C. Gabriel Castillo Hernández 6


También conocida como ligado, enlazado o linkeado (derivada de linker, nombre en inglés con que se le conoce al
programa que realiza éste proceso), en este último paso se adjunta al código binario del programa toda la información
faltante y que forma parte de las funciones y variables estándares del lenguaje C

La salida de este proceso el


programa ejecutable.

Ing. Patricia Del Valle Morales, M. en C. Gabriel Castillo Hernández 7


En la práctica, los sistemas están constituidos por decenas de archivos fuentes, ya sea archivos de código fuente
(*.c) o archivos de encabezados (*.h), todos ellos escritos por el equipo desarrollador. El proceso de compilación
de un proyecto de éste tipo modifica un poco el esquema planteado anteriormente, pero su esencia se mantiene.

Ing. Patricia Del Valle Morales, M. en C. Gabriel Castillo Hernández 8


1.1 Representación de datos
en la memoria
Variables, memoria y arreglos

Ing. Patricia Del Valle Morales, M. en C. Gabriel Castillo Hernández 9


1.1.1Tipos de datos primitivos

✓ Un tipo de dato establece el conjunto de valores que un dato puede tomar y las
operaciones que se pueden realizar con sus elementos.

✓ Así, un tipo de datos “entero” establece qué valores enteros son válidos y qué
operaciones se pueden realizar (la suma, la resta, la multiplicación y la división son
válidas mientras que la concatenación no lo es).

✓ Un tipo de datos “cadena de caracteres” puede establecer que la concatenación


es posible, pero las operaciones de suma, resta, multiplicación y división son
invalidas

Ing. Patricia Del Valle Morales, M. en C. Gabriel Castillo Hernández 10


1.1.1Tipos de datos primitivos

Ing. Patricia Del Valle Morales, M. en C. Gabriel Castillo Hernández 11


1.1.1Tipos de datos primitivos

Ing. Patricia Del Valle Morales, M. en C. Gabriel Castillo Hernández 12


Los números como un tipo de dato
• Un tipo de datos comúnmente usado son los números.

• Suponga que se desea almacenar en una celda un número no fraccionario.

• Podemos almacenar un número entero (0, 1, 2, 3, etc.) o un numero entero con signo (… -3,
-2, -1, 0, 1, 2, 3, …).

• Como sabemos en el concepto matemático los números son infinitos, en computación esto
no es cierto.

Ing. Patricia Del Valle Morales, M. en C. Gabriel Castillo Hernández 13


Si empleamos una celda de 4 bits para almacenar un
número no fraccionario, entonces solo dispondremos de
un conjunto de 16 valores posibles.

Si son números sin signo, entonces solamente podremos


representar números en el rango de [0 y 15], cualquier
valor fuera de este intervalo no podrá ser representado.

Por ejemplo, la secuencia 0101 representa un 5 mientras


la secuencia 1001 representa un 9. El número 23 no existe
ni tampoco el 16.

Ing. Patricia Del Valle Morales, M. en C. Gabriel Castillo Hernández 14


• Si deseamos representar enteros con signo?

el problema se complica porque es necesario representar el


signo (positivo o negativo) lo cual consume al menos un bit.

Ing. Patricia Del Valle Morales, M. en C. Gabriel Castillo Hernández 15


Representación signo-magnitud

Una de las primeras representaciones


es signo-magnitud, en ella el signo se
representa por medio de algún bit, por
ejemplo, el bit más significativo.

Tres bits para representar la magnitud


y uno el signo.

Ing. Patricia Del Valle Morales, M. en C. Gabriel Castillo Hernández 16


Representación complemento a 2

• Algoritmo de complemento a 2

1. A la secuencia de bits (la magnitud en éste caso) cambiar:


ceros →por unos
y unos → por ceros
2. Al resultado sumarle un 1,

3. si hay un acarreo del bit más a la izquierda hacia afuera (del 4º. bit al 5º. bit para nuestro
ejemplo) este se pierde.

Ing. Patricia Del Valle Morales, M. en C. Gabriel Castillo Hernández 17


Complemento a 2
1. El bit más significativo es bit de signo
2. Si el bit más significativo está apagado el número es positivo y su magnitud se
obtiene de manera normal
3. Si el bit más significativo esta encendido el número es negativo y la magnitud se
obtiene aplicando el algoritmo de complemento a dos

0111 +7
1101 0010+0001 = 0011 -3

Ing. Patricia Del Valle Morales, M. en C. Gabriel Castillo Hernández 18


Complemento a 2

• Para transformar un número negativo a complemento a dos:

1. Ignorar el signo, tomar en cuenta únicamente la magnitud


2. Aplicar a la magnitud el algoritmo de complemento a dos el resultado es el
número en complemento a 2
3. No olvide limitar la representación a un número fijo de bits (en nuestro ejemplo
4)

-5 magnitud 5 0101 (cuatro bits) 1010+0001 => 1011

+5 magnitud 5 0101 (cuatro bits) => 0101

Ing. Patricia Del Valle Morales, M. en C. Gabriel Castillo Hernández 19


En la representación en complemento a 2 los
números positivos siempre tendrán el bit
más a la izquierda en cero y los tres bits
restantes representan la magnitud.

En el caso de los números negativos se


representarán mediante el algoritmo de
complemento a dos de la magnitud del
número que deseamos representar.

De manera general los programas


representan a los números enteros con
signo con base en complemento a 2, la
representación signo-magnitud se descarta
debido a los problemas que esta presenta.

Ing. Patricia Del Valle Morales, M. en C. Gabriel Castillo Hernández 20


Programa1: representación de los tipos de datos
Probar para diferentes valores de x, ¿qué ocurre? ¿por qué? explique

#include <stdio.h>

int main()
{
char x;
char y;

while (1) {
printf("Dame un numero: ");
scanf("%d",&x);
y = x+100;
printf("%d + 100 = %d\n",x, y);
y = x-100;
printf("%d - 100 = %d\n",x, y);
printf("Que inteligentes somos las computadoras!\n");
}
}
Ing. Patricia Del Valle Morales, M. en C. Gabriel Castillo Hernández 21
Los números enteros con signo se representan en complemento a 2 y el rango de valores
que se puede representar es [-2n,2n-1] (porque el cero forma parte de la representación
de los positivos).

Si se emplean:
4 bits el rango es [-8,7]
8 bits [-128, 127],
con 16 bits [-32,768 y 32,767]
con 32 bits [-2,147,483,648, 2,147,483,647]

¿Cuántos bits se utilizan y cuál es el rango de valores que un número entero con signo
tiene en el compilador C que usted utiliza?

Revise WikipediA ( C data tpes)

https://en.wikipedia.org/wiki/C_data_types

Ing. Patricia Del Valle Morales, M. en C. Gabriel Castillo Hernández 22


Y ¿qué pasa en el caso de los números reales?, en ese caso hay dos representaciones:
números de punto fijo y números de punto flotante.

Es interesante notar que a nivel de bits no es lo mismo un número entero que un número de
punto flotante o punto fijo.

Aquí encontrará información sobre representación de números reales:

https://www.uv.es/~diaz/mn/node7.html

Ing. Patricia Del Valle Morales, M. en C. Gabriel Castillo Hernández 23


Las Variables y la memoria

Ing. Patricia Del Valle Morales, M. en C. Gabriel Castillo Hernández 24


• Supóngase que un programador desea almacenar los datos de las
calificaciones de un grupo.

• Por lo tanto, requiere almacenar en memoria las calificaciones, de modo


que la calificación:

• del primer alumno (8) se puede almacenar por ejemplo en la celda de


memoria cuya dirección es 34563,

• la segunda calificación se almacenará en la dirección 34564 (9),

• la tercera calificación en la dirección 34565 (3),

• y así sucesivamente.

Ing. Patricia Del Valle Morales, M. en C. Gabriel Castillo Hernández 25


Programa: Obtener Promedio.

1. En la celda 34566 almacena un cero

2. Lee la calificación del primer alumno y almacenarlo en la celda 34563

3. Leer la calificación del segundo alumno y almacenarla en la celda


34564

4. Leer la calificación del tercer alumno y almacenarla en la celda 34565

5. A la celda 34566 súmale el contenido de la celda 34563

6. A la celda 34566 súmale el contenido de la celda 34564

7. A la celda 34566 súmale el contenido de la celda 34565

8. Divide la celda 34566 entre 3


9. Imprime el contenido de la celda 34566

Ing. Patricia Del Valle Morales, M. en C. Gabriel Castillo Hernández 26


Una variable es el nombre que el programador le da a una celda de memoria que
contendrá algún dato o información
tabla de símbolos Programa: Obtener Promedio.

1. En la variable promedio almacena un cero

2. Lee la calificación del primer alumno y almacenarlo en la variable calificacion1

3. Leer la calificación del segundo alumno y almacenarla en la variable


calificacion2

4. Leer la calificación del tercer alumno y almacenarla en la variable calificacion3

5. A la variable promedio súmale el contenido de la variable calificacion1

6. A la variable promedio súmale el contenido de la variable calificacion2

7. A la variable promedio súmale el contenido de la variable calificacion3

8. Divide la variable promedio entre 3


9. Imprime el contenido de la variable promedio
Ing. Patricia Del Valle Morales, M. en C. Gabriel Castillo Hernández 27
Tamaño de un tipo de dato en memoria
• El tamaño se mide en bytes

• El operador sizeof(tipo de dato o variable) entrega el tamaño en


bytes del parámetro recibido. Ejemplo:

printf("%d\n“,sizeof(char));

• Es el diseñador del compilador quien establece el tamaño que


ocupará cada tipo de dato

Ing. Patricia Del Valle Morales, M. en C. Gabriel Castillo Hernández 28


Programa 2: sizeof()

Complete el programa 2 con:


• El tipo de dato al que se quiere obtener el tamaño en bytes,
• El nombre del operador
• El tipo de dato que se requiere imprimir a pantalla

Ing. Patricia Del Valle Morales, M. en C. Gabriel Castillo Hernández 29


• Los tipos de datos ocupan diferente cantidad de memoria en gcc

#include <stdio.h>
#include <stdlib.h>

int main()
{
printf("Tamanio de un char: %d \n",sizeof(char));
printf("Tamanio de un int: %d\n",sizeof(int));
printf("Tamanio de un long int: %d\n",sizeof(long int));
printf("Tamanio de un long long int: %d \n",sizeof(long long int));
printf("Tamanio de un float: %d \n",sizeof(float));
printf("Tamanio de un double: %d \n",sizeof(double));
printf("Tamanio de un void *: %d \n",sizeof(void *));
return 0;
}
Ing. Patricia Del Valle Morales, M. en C. Gabriel Castillo Hernández 30
Variables en memoria

char x;
1 byte
x = ‘a’; 242
Tabla de símbolos: 243

Atributo Valor 244

Nombre x 245 a

Tipo char 246

Dirección 245 247

Contenido a 248
char 249

RAM
Ing. Patricia Del Valle Morales, M. en C. Gabriel Castillo Hernández 31
Variables en memoria

int w;
4 bytes
w = 10; 242
243
Tabla de símbolos:
Atributo Valor 244

Nombre w 245

Tipo int 246

Dirección 245 247

Contenido 10 248
Número entero 249

Ing. Patricia Del Valle Morales, M. en C. Gabriel Castillo Hernández 32

También podría gustarte