Tip Datos ANSI C
Tip Datos ANSI C
Computacin I
Computacin I Se puede declarar ms de una variable de un tipo determinado en una sola sentencia. Se puede tambin inicializar la variable en la declaracin. Por ejemplo, para definir la variable carcter letra y asignarle el valor a, se puede escribir: char letra = a; A partir de ese momento queda definida la variable letra con el valor correspondiente a la letra a. Recurdese que el valor a utilizado para inicializar la variable letra es una constante carcter. En realidad, letra se guarda en un solo byte como un nmero entero, el correspondiente a la letra a en el cdigo ASCII, que se muestra en la Tabla 2.3 para los caracteres estndar (existe un cdigo ASCII extendido que utiliza los 256 valores y que contiene caracteres especiales y caracteres especficos de los alfabetos de diversos pases, como por ejemplo las vocales acentuadas y la letra para el castellano).
0 1 2 3 4 5 6 7 8 9 10 11 12
1 soh vt nak us ) 3 = G Q [ e o y
Tabla 2.3. Cdigo ASCII estndar. 3 4 5 6 Etx eot enq ack Cr so si dle Etb can em sub # $ + , . 5 6 7 8 @ A B I J K L S T U V ] ^ _ ` G h i j Q r s t { | } ~
8 bs dc2 fs & 0 : D N X b l v
9 ht dc3 gs 1 ; E O Y c m w
La Tabla 2.3 se utiliza de la siguiente forma. La primera cifra (las dos primeras cifras, en el caso de los nmeros mayores o iguales que 100) del nmero ASCII correspondiente a un carcter determinado figura en la primera columna de la Tabla, y la ltima cifra en la primera fila de la Tabla. Sabiendo la fila y la columna en la que est un determinado carcter puede componerse el nmero correspondiente. Por ejemplo, la letra A est en la fila 6 y la columna 5, su nmero ASCII es por tanto 65. El carcter % est en la fila 3 y la columna 7, por lo que su representacin ASCII ser el 37. Obsrvese que el cdigo ASCII asocia nmeros consecutivos con las letras maysculas y minsculas ordenadas alfabticamente. Esto simplifica notablemente ciertas operaciones de ordenacin alfabtica de nombres. En la Tabla 2.3 aparecen muchos caracteres no imprimibles (todos aquellos que se expresan con 2 3 letras). Por ejemplo, el ht es el tabulador horizontal, el nl es el carcter nueva lnea, etc. Volviendo al ejemplo de la variable letra, su contenido puede ser variado cuando se desee por medio de una sentencia que le asigne otro valor, por ejemplo: letra = z; Tambin puede utilizarse una variable char para dar valor a otra variable de tipo char: caracter = letra; // Ahora caracter es igual a z Como una variable tipo char es un nmero entero pequeo (entre 0 y 255), se puede utilizar el contenido de una variable char de la misma forma que se utiliza un entero, por lo que estn permitidas operaciones como: letra = letra + 1; letra_minuscula = letra_mayuscula + (a - A);
Computacin I En el primer ejemplo, si el contenido de letra era una a, al incrementarse en una unidad pasa a contener una b. El segundo ejemplo es interesante: puesto que la diferencia numrica entre las letras minsculas y maysculas es siempre la misma (segn el cdigo ASCII), la segunda sentencia pasa una letra mayscula a la correspondiente letra minscula sumndole dicha diferencia numrica. Recurdese para concluir que las variables tipo char son y se almacenan como nmeros enteros pequeos. Ya se ver ms adelante que se pueden escribir como caracteres o como nmeros segn que formato de conversin se utilice en la llamada a la funcin de escritura.
Computacin I unsigned long numero_positivo_muy_grande; En algunas computadoras una variable int ocupa 2 bytes (coincidiendo con short) y en otros 4 bytes (coincidiendo con long). Lo que garantiza el ANSI C es que el rango de int no es nunca menor que el de short ni mayor que el de long.
Computacin I Las variables tipo double se declaran de forma anloga a las anteriores: double real_grande; Por ltimo, existe la posibilidad de declarar una variable como long double, aunque el ANSI C no garantiza un rango y una precisin mayores que las de double. Eso depende del compilador y del tipo de computadora. Estas variables se declaran en la forma: long double real_pero_que_muy_grande; cuyo rango y precisin no est normalizado. Los compiladores de GNU y los de Microsoft para PCs utilizan 10 bytes (64 bits para la mantisa y 16 para el exponente).
Computacin I Una variable extern es definida o creada (una variable se crea en el momento en el que se le reserva memoria y se le asigna un valor) una sola vez, pero puede ser declarada (es decir, reconocida para poder ser utilizada) varias veces, con objeto de hacerla accesible desde diversas funciones o ficheros. Tambin estas variables pueden ocultarse mediante la declaracin de otra variable con el mismo nombre en el interior de un bloque. La variables extern permiten transmitir valores entre distintas funciones, pero sta es una prctica considerada como peligrosa. A continuacin se presenta un ejemplo de uso de variables extern. float i=15.3, j, k; // se declaran antes de main() int main() { int i=3; // i=1 se hace invisible int func1(int, int); ... // j, k son visibles ... // i es entera no real return 0; } int func1(int m) { int k=3; // k=0 (float) se hace invisible ... // i=1 (entera) es invisible ... // i=15.3 (real) es visible } 3. static. Cuando ciertas variables son declaradas como static dentro de un bloque, estas variables conservan su valor entre distintas ejecuciones de ese bloque. Dicho de otra forma, las variables static se declaran dentro de un bloque como las auto, pero permanecen en memoria durante toda la ejecucin del programa como las extern. Cuando se llama varias veces sucesivas a una funcin (o se ejecuta varias veces un bloque) que tiene declaradas variables static, los valores de dichas variables se conservan entre dichas llamadas. La inicializacin slo se realiza la primera vez. Por defecto, son inicializadas a cero. Las variables definidas como static extern son visibles slo para las funciones y bloques comprendidos desde su definicin hasta el fin del archivo. No son visibles desde otras funciones ni aunque se declaren como extern. sta es una forma de restringir la visibilidad de las variables. Por defecto, y por lo que respecta a su visibilidad, las funciones tienen modo extern. Una funcin puede tambin ser definida como static, y entonces slo es visible para las funciones que estn definidas despus de dicha funcin y en el mismo fichero. Con estos modos se puede controlar la visibilidad de una funcin, es decir, desde qu otras funciones puede ser llamada. 4. register. Este modo es una recomendacin para el compilador, con objeto de que (si es posible) ciertas variables sean almacenadas en los registros de la CPU y los clculos con ellas sean ms rpidos. No existen los modos auto y register para las funciones.
Computacin I automtica e implcita de tipo (el programador no necesita intervenir, aunque s conocer sus reglas), se le denomina promocin, pues la variable de menor rango es promocionada al rango de la otra. As pues, cuando dos tipos diferentes de constantes y/o variables aparecen en una misma expresin relacionadas por un operador, el compilador convierte los dos operandos al mismo tipo de acuerdo con los rangos, que de mayor a menor se ordenan del siguiente modo:
long double > double > float > unsigned long > long > unsigned int > int > char
Otra clase de conversin implcita tiene lugar cuando el resultado de una expresin es asignado a una variable, pues dicho resultado se convierte al tipo de la variable (en este caso, sta puede ser de menor rango que la expresin, por lo que esta conversin puede perder informacin y ser peligrosa). Por ejemplo, si i y j son variables enteras y x es double, x = i*j j + 1; En C existe tambin la posibilidad de realizar conversiones explcitas de tipo (llamadas casting, en la literatura inglesa). El casting es pues una conversin de tipo, forzada por el programador. Para ello basta preceder la constante, variable o expresin que se desea convertir por el tipo al que se desea convertir, encerrado entre parntesis. En el siguiente ejemplo, k = (int) 1.7 + (int) masa; la variable masa es convertida a tipo int, y la constante 1.7 (que es de tipo double) tambin. El casting se aplica con frecuencia a los valores de retorno de las funciones.