Introducción a C: Variables, Tipos El tipo «int» Clase 3 Introducción a la Computación Patricia Borensztejn Estructura de un programa en C Hello, World • Un programa en C consta de funciones y variables. • Una función contiene proposiciones que especifican las operaciones de cálculo que se van a realizar, y las variables almacenan los valores utilizados durante los cálculos. • En nuestro primer programa, la función se llama «main». Uno puede darle cualquier nombre a las funciones, pero «main» es especial y tiene que estar : el programa comenzará a ejecutarse a partir de alli. #include <stdio.h> int main() { printf("Hello world!\n"); } La función principal: main() • Por lo general, main() llamará a otras funciones, algunas que usted escribió, y otras de bibliotecas escritas previamente, como printf() • La sentencia #include indica al compilador que debe incluir información de la biblioteca standard de entrada /salida • Porque main()? #include <stdio.h> int main() { printf("Hello world!\n"); } Variables #include <stdio.h> int main() { int suma,i; suma=0; for(i=3;i<1000;i++) { if((i%3==0)||(i%5==0)) suma=suma+i; } printf("El resultado es %d\n",suma); return 0; } • Main, es el nombre de la función (la principal). • Suma, i : son dos nombres de variables. Por lo tanto, son nombres simbólicos de sus direcciones. • Todas las variables hay que declararlas, diciendo su nombre y su tipo. Declaraciones de Variables • La declaración de variables reserva espacio en memoria, suficiente para alojar a cada una de esas variables según su tamaño. • El tamaño de las variables está definido por el tipo de las mismas. • El nombre de las variables es la posición que ocupa en memoria. • La sintaxis del lenguaje permite referirse a la dirección de la variable y también a su valor. Interface software-hardware Valor y Dirección de una Variable • Una variable es la dirección de una zona de memoria cuyo tamaño está determinado por su tipo en su declaración. • Como la memoria se direcciona a nivel de bytes, entonces mas exactamente podemos decir que el nombre de la variable es la dirección del byte menos significativo (mas bajo) del dato. (en el ejemplo, var1 es 4) int var1=1234; 1234 decimal=04D2 hexa var1 0 0 1 1 2 2 3 3 4 D2 5 04 var1 4 5 6 6 7 7 11010010 00000100 Curiosidad • Si yo tengo una variable que ocupa mas de un byte, ¿como la almaceno? – ¿Con el byte menos significativo en la posición mas baja de memoria? – ¿Con el byte menos significativo en la posición mas alta de memoria? 04D2 var1 0 0 1 1 2 2 3 3 4 D2 5 04 var1 4 04 5 D2 6 6 7 7 Curiosidad • Y, como no se ponían de acuerdo los diseñadores de computadoras, unos lo hicieron de una manera y otros de otra manera….. – Little endian (Intel, y otros) – Big endian (Sparc, Mips, y otros) Son los nombres que ambas maneras de representar tienen . • Y ¿cual es el problema de la coexistencia de ambas representaciones? – Que si yo transfiero bytes de una máquina a otra, … se produce el lío!!!! – Una manda primero (little endian) el byte menos significativo y el otro lo recibe y lo interpreta como el byte mas significativo Valor y Dirección de una Variable • Para asignarle un valor a la variable lo hacemos de la siguiente manera: var1=3456 ; Esto se lee así: en la dirección de memoria var1 guardar el valor 3456 var1=var2; Esto se lee así: en la dirección de memoria var1 guardar el valor almacenado en la dirección de memoria var2 • Es decir: – Cuando la variable está a la izquierda de la asignación, se interpreta como una dirección – Cuando la variable está a la derecha de la asignación, sola o formando parte de expresiones mas complejas, se interpreta como un valor. • Y, cual es esa dirección? Puedo saberlo? – Si, puedo saberlo y usar esa dirección: en C es &var1 var2=&var1; O bien printf ("la dirección de la variable var es %i y su valor es %i\n", &var1, var1); Punteros en C • Bueno, solo para confundir : – Si hacemos esta asignación: • a= &var1; Lo que hemos creado (o sea, a) es un puntero. 0 b=a+var1; // b=04+D204=D208 1 b=(*a)+var1; // b=D204+D204=1A408 2 3 Fijense que &a= 0006 hexa var1 a=a+2 ; // ahora a vale 08 y ya no es mas igual a var1 a TODO ESTO y MUCHO MAS EN: ARITMÉTICA DE PUNTEROS 4 04 5 6 D2 04 7 00 Tipos de Datos • Cada tipo de dato está caracterizado por: – – – – Su nombre Dominio de valores que puede tomar Su representación Operaciones asociadas • Por ejemplo: – El tipo de dato entero: • • • • Su nombre: int (short int) Su rango de valores: [-32768..0..32767] (en 16 bits) Su representación: Complemento a dos Operaciones asociadas: +,-,*,div,mod,** Tipos de Datos • En función de quien los define: – Tipos de Datos Básicos (define el lenguaje) – Tipos de Datos definidos por el Usuario • En función de su representación interna – Tipos de datos simples o escalares – Tipos de datos estructurados • Ejemplo: int es un tipo básico escalar Tipos de Datos Básicos Escalares • Enteros con signo • Enteros sin signo Enteros: Ejemplos • Tomar el programa euler1.c y reemplazar el tipo int de la variable suma por el tipo char. Observar y explicar el comportamiento. • Aplicar al rango: 1..500 con el tipo short, y luego unsigned short. Observar y explicar el comportamiento. Representación de Enteros • Complemento a 2: – Los números positivos se representan en binario natural – Los números negativos se representan: – Donde: N es el número a representar, n es el número de bits de la representación. – Los números cuyo bit mas significativo es 1 se interpretan como negativos – Los números cuyo bit mas significativo es 0 se interpretan como positivos • Ejemplo: representar N=-25 con n=6 • Respuesta= 64-25=39(decimal)= 100111(binario) Tipos de datos escalares Trabajando con enteros positivos: Euler 2 Each new term in the Fibonacci sequence is generated by adding the previous two terms. By starting with 1 and 2, the first 10 terms will be: 1, 2, 3, 5, 8, 13, 21, 34, 55, 89, ... By considering the terms in the Fibonacci sequence whose values do not exceed four million, find the sum of the even-valued terms. Trabajando con enteros positivos: Euler 3 The prime factors of 13195 are 5, 7, 13 and 29. What is the largest prime factor of the number 600851475143 ?