Explora Libros electrónicos
Categorías
Explora Audiolibros
Categorías
Explora Revistas
Categorías
Explora Documentos
Categorías
TIPOS DE DATOS
2.1. INTRODUCCIÓN
a) Constantes
En una nueva compilación se puede modificar su valor en un solo sitio, el mismo
que se actualiza en donde se encuentre la constante.
El nombre de la constante define claramente su valor. Además, el compilador es
capaz d e identificar el tipo de dato d e la constante por el aspecto que tiene,
entonces, no se necesita definir el tipo de dato.
b) Variables
El tipo de dato define un conjunto de valores que puede tener una variable, junto con
un conjunto de operaciones que se pueden realizar sobre esa variable. Los tipos de datos
comunes son los números enteros, números reales y caracteres.
Todos los lenguajes de alto nivel soportan el concepto de tipos de datos, aunque el
lenguaje C tiene cinco tipos de datos básicos incorporados; no se trata de un lenguaje
fuertemente tipificado, porque se permite casi todas las conversiones de tipos. El
lenguaje C no lleva a cabo comprobaciones de errores en tiempo de ejecución, estas
comprobaciones quedan enteramente a responsabilidad del programador.
En lenguaje C existen cinco tipos de datos básicos, y todos los demás tipos de datos
se basan en estos tipos. Los cinco tipos de datos básicos son: (SCHILDT, 1994)
char Caracter
int Entero
float Punto flotante
double Punto flotante de doble precisión
void Sin valor
Modificadores. A excepción del tipo void, los tipos de datos básicos pueden tener
distintos modificadores, para rango y signo: (SCHILDT, 1994)
signed
unsigned
long
short
Estos modificadores se aplican al tipo base int, pero signed y unsigned también se
aplican a char, y long se puede aplicar a double.
Los valores de este tipo son definidos por un conjunto de caracteres, en general por
el código ASCII, el cual es utilizado por el computador para identificar a cada caracter.
a) Enteros con signo. Son los tipos de datos: int, signed int, short int, signed short int,
long int, y signed long int. Los valores permitidos para estos tipos son números
enteros positivos, negativos o cero.
El tipo int se refiere al tamaño de palabra estándar, en este caso en que la palabra
de memoria es de 16 bits (depende del compilador y entorno), el rango de valores
está desde -32768 a 32767.
En su representación binaria del tipo int se utiliza el bit más significativo para
indicar el signo del número, por lo que el m a yor entero con signo que se puede
almacenar en una palabra será:
2n-1 - 1
donde:
--‐ n, número de bits de la palabra de memoria.
b) Enteros sin signo. S on los tipos de datos: unsigned int, unsigned short int, y
unsigned long int; los cuales pueden ser únicamente positivos o cero.
El mayor entero "sin signo" será mayor que el mayor entero "con signo", porque
el bit de signo de los enteros "con signo" se utiliza para la magnitud en los enteros
"sin signo", por lo que el rango de un tipo un si gn ed int, en este caso en qu e la
palabra de memoria es de 16 bits, tiene el rango de 0 a 65535.
Los números de punto flotante sirven cuando se necesitan números de mayor rango,
incluyendo fracciones, y para mayor precisión cuando se tienen cálculos matemáticos.
Los números en punto flotante se representan en notación científica, por ejemplo:
Son los mismos números de punto flotante, pero con mayor precisión (número de
dígitos que se pueden almacenar).
El tipo double (doble precisión) utiliza el doble número de bits que el tipo float, en
este caso 64 bits. Se incrementan los bits de la parte fraccionaria o mantisa a 11 y la parte
exponencial a 52, para incrementar la precisión (es decir reducir los errores de
redondeo) y aumentar el rango de los números, respectivamente. Esto permite u n a
precisión de 15 cifras decimales y un rango de ±(2.2e-308 a 1.8e308). (SCHILDT, 1994)
En la Tabla 2.1 se muestra todas las combinaciones de los tipos de datos que se
ajustan al estándar ANSI, para el lenguaje C en el sistema operativo Windows de 32 bits.
Tabla 2.1. Tipos de Datos de C (SCHILDT, 1994)
TAMAÑO
TIPO RANGO MÍNIMO
EN BITS
char 8 -128 a 127
CARACTER unsigned char 8 0 a 255
signed char 8 -128 a 127
int 16 -32768 a 32767
unsigned int 16 0 a 65535
signed int 16 Igual que int
short int 16 Igual que int
unsigned short
16 0 a 65535
int
ENTERO signed short
16 Igual que short int
int
-2147483648 a
long int 32
2147483647
signed long int 32 Igual a long int
unsigned long
32 0 a 4294967295
int
±(1.8e-38 a 3.4e+38) 6
float 32
dígitos de precisión
±(2.2e-308 a 1.8e+308)
PUNTO double 64
15 dígitos de precisión
FLOTANTE
±(3.4e-4932 a
long double 80 1.2e+4932) 18 dígitos
de precisión
SIN TIPO void 0 Sin valor
2.3. CONSTANTES
Las constantes en lenguaje C son valores fijos que no pueden ser alterados por el
programa. Estas constantes son de cualquier tipo de datos básicos y la forma en que se
representa cada constante depende de su tipo.
Una constante char puede representar tan sólo un único caracter que normalmente
corresponde al código ASCII, y que va encerrada entre apóstrofes. Por ejemplo, los
caracteres: 'a' y '*'.
Un caracter que no se puede introducir desde teclado, puede ser introducido de las
dos formas siguientes:
1. Secuencias de escape. Son caracteres especiales predefinidos, que deben usar una
"barra invertida" (\) y luego su código, en lugar de sus equivalentes ASCII;
asegurando así la portabilidad del código. Estos caracteres se indican en la Tabla 2.2.
CÓDIGO SIGNIFICADO
Retroceso (back space - Espacio
\b
atrás)
\f Salto de página
Salto de línea (new line - nueva
\n
línea)
\r Retorno de carro (carriage retum)
Tabulación horizontal (tab -
\t
tabulador)
\v Tabulador vertical
\" Comillas rectas
\' Apóstrofe
\\ Barra invertida (back slatch)
\0 Nulo
\a Alerta (sonido)
Observaciones:
Los tres siguientes: \", \' y \\ permiten utilizar los caracteres: ", ' y \; que son
utilizados como delimitadores de cadenas, de caracteres e identificadores de
caracteres.
También estos caracteres deben encerrarse entre apóstrofes, por ejemplo: '\n',
'\b', etc.
2. Número de código ASCII. Este número indica el caracter correspondiente, como se
muestra en la Tabla 2.3; para esto dicho número de código debe escribirse en octal o
en hexadecimal, luego de una barra invertida y todo encerrado entre apóstrofes, para
identificarlo como un único caracter.
CODIGO SIGNIFICADO
\N Constante octal (N es una constante octal)
Constante Hexadecimal (xN es una constante
\xN
hexadecimal)
Especifican números enteros, es decir sin parte fraccionaria, por ejemplo: 10, 50 y -
100.
Octal Una constante octal comienza por el caracter '0' (cero), por ejemplo:
020 (16 en decimal).
Hexadecimal Una constante hexadecimal comienza por los caracteres 0x, por
ejemplo: 0x20 (32 en decimal).
También, un valor numérico dentro del rango del tipo caracter no puede ser
almacenado como char, porque se mezclan los tipos.
Una constante cadena es una secuencia de caracteres encerrada entre comillas. Por
ejemplo:
Son los nombres usados para referenciar las constantes simbólicas, variables,
funciones, etiquetas y otros objetos definidos por el usuario.
El primer caracter siempre debe ser una letra del alfabeto inglés o el carácter d e
subrayado, mientras que los caracteres siguientes pueden ser letras, números o símbolos
de subrayado. Por ejemplo, son identificadores: cont, num_total y curso1.
Un identificador no puede ser igual a una palabra clave del lenguaje C, tampoco
debe tener el mi smo nombre que alguna función ya escrita o que se encuentre en la
biblioteca del lenguaje C. (SCHILDT, 1994)
Todas las variables en lenguaje C deben ser declaradas antes de poder ser usadas, la
forma general de la "Sentencia de declaración" es: (SCHILDT, 1994)
tipo lista_variables;
donde:
--‐ tipo, debe ser un tipo de dato válido de lenguaje C con cualquier modificador.
--‐ Punto y coma (;), la sentencia de declaración finaliza siempre con un punto y
coma.
Por ejemplo:
int perno, tuerca;
unsigned int alumnos, jugadores;
char oro, plomo, plata;
float blanco, rojo;
Las variables de un mismo tipo se pueden declarar en una sola sentencia o en varias
para poner comentarios.
a) Variables Locales
Las variables locales solo existen mientras se ejecuta el bloque de código en el que
ha sido declarada. Ya que la variable local se crea en el "segmento de pila" al entrar
en el bloque de código y se destruye al salir de él.
Se puede inicializar una variable local con algún valor determinado. Este valor
será asignado cada vez que se entre en el bloque de código en que la variable está
declarada.
b) Parámetros Formales
Si la función usa argumentos, deben declararse las variables que van a aceptar los
valores de esos argumentos; estas variables son los parámetros formales de la
.
función. Su declaración se hace tras el nombre de la función encerrado entre
paréntesis.
c) Variables Globales
Sin embargo, lo mejor es declarar todas las variables globales al principio del
programa.
Cuando una función tiene declarada una variable local del mismo nombre de una
global, la función reconoce a la variable local y no reconoce a la variable global.
Las variables globales son muy útiles cuando se usan los mismos datos en varias
funciones del programa. Pero el uso de una variable global hace que una función sea
menos general, debido a que depende de algo que debe estar definido fuera de ella.
Las comillas rectas no forman parte de la cadena, solo sirven para delimitarla.
E s u n a c a d e n a \0
char nombre[35];
donde:
--‐ [], identifican la variable nombre como un arreglo.
Observación: La cadena "x" no es igual que el caracter 'x', por las siguientes razones:
Por ejemplo:
char ch = 'a' ;
int perros, caballos = 32;
float vacas = 34, cabras = 14;
Únicamente se inicializan las variables que tienen el valor luego del signo igual. Por
ejemplo: ch = 'a', caballos = 32, vacas = 34 y cabras = 14; pero perros tiene un valor
indeterminado si es una variable local.
Para indicar que es una sentencia de preprocesador ésta comienza con el caracter #, y
se sitúan normalmente fuera de las funciones. Además, estas sentencias no terminan con
punto y com a, porque cada sentencia com ienza con el caracter # y siempre va una
sentencia por línea. (SCHILDT, 1994)
Por ejemplo:
#define PI 3.1416
2. Se puede modificar con facilidad su valor, porque esa modificación será realizada
solamente en la declaración de la constante.
Por ejemplo:
El modificador const ayuda a identificar las variables que nunca cambian de valor.
Se define una constante declarando la palabra const antes de las palabras clave para
indicar el tipo: int, float, d ou b l e , etc. Ad em ás , c o m o una constante n o puede ser
cambiada, se debe inicializarla en su declaración.
Por ejemplo:
Se pueden definir las constantes de dos formas: mediante la palabra clave const y
mediante la directiva de compilación #define. En muchos programas la acción de estos
dos métodos es esencialmente la misma, pero el uso de la palabra clave const tiene por
resultado una "variable" cuyo valor no puede ser cambiado. (SCHILDT, 1994)
Por ejemplo, declarar la variable reloj para que cambie su valor sin que el programa
tenga constancia: el programa que contiene la variable reloj puede ser interrumpido por
el reloj del sistema y a la vez la variable reloj cambiada. Por ejemplo, la declaración de la
variable reloj sería:
/* Este es un ejemplo.*/
2.11. OPERADORES
--‐ Aritméticos.
--‐ Relacionales.
--‐ Lógicos.
--‐ A nivel de bits.
nombre_variable = expresión;
donde:
--‐ expresión, puede ser una constante, una variable, o la unión de constantes y
variables a través de operadores, o una llamada a función que toma un valor.
31
--‐ nombre_variable, debe ser una variable o un puntero, que es el destino donde
se asigna el valor de la expresión.
Por ejemplo:
int bmw;
bmw = 2002;
OPERADOR ACCIÓN
- Resta o unario de signo
+ Suma
* Multiplicación
/ División
% Residuo
++ Incremento
-- Decremento
Los primeros cinco operadores son binarios y los operadores -, ++ y -- son unarios.
Las características generales de estos operadores se indican a continuación:
13 % 5 ,da un resultado de 3
-2 % 6 ,da un resultado de -2
5 % -7 ,da un resultado de 5
a) Prefijo. El ++ aparece antes del operando, con lo que el lenguaje C lleva a cabo la
operación de incremento antes de utilizar el valor del operando.
x = 10;
y = ++x;
Pero, si se escribe:
x = 10;
y = x++;
Ventajas:
NOTAS:
--‐ Para las cuatro operaciones aritméticas, la operación mixta entre operandos de
tipo entero y punto flotante da un resultado en punto flotante. Es decir, el entero
que intervenga en esta operación se convierte en punto flotante antes de realizar
la operación.
++talla;
talla++;
donde:
--‐ variable, se actualiza utilizando el valor de la expresión, de acuerdo a la
operación indicada por el operador binario.
Por ejemplo:
OPERADOR ACCIÓN
> Mayor que
>= Mayor o igual que
< Menor que
<= Menor 0 igual que
== Igual que
!= Diferente que
Para comparar números de punto flotante se usan únicamente los operadores < y
>, porque dos números de punto flotante no pueden ser necesariamente iguales,
cuando son resultados de operaciones aritméticas, debido a errores de redondeo
o truncamiento.
Las expresiones que utilizan los operadores relacionales devuelven el valor 1 en caso
de verdadero y 0 en caso de falso.
Por ejemplo:
3>5 el resultado es 0
2 == 9 el resultado es 0
'x' > 0 el resultado es 1 /* Compara el ordinal de x con 0 */
2.11.4. Operadores Lógicos
OPERADOR ACCIÓN
&& AND
ll OR
! NOT
Los operadores lógicos producen un resultado verdadero (1) o falso (0), en la Tabla
2.9 se muestran las tablas de verdad para los operadores lógicos.
p q p && q p ll q !p
0 0 0 0 1
0 1 0 1 1
1 0 0 1 0
1 1 1 1 0
donde:
--‐ 1, es verdadero.
--‐ 0, es falso.
Las operaciones a nivel de bits no se pueden usar sobre los tipos: float, double, long
double y void.
OPERADOR ACCIÓN
& AND
| OR
^ OR exclusiva (XOR)
~ Complemento a 1 (NOT)
>> Desplazamiento a la derecha
<< Desplazamiento a la izquierda
Los operadores AND, OR, y NOT a nivel de bits están gobernados por las mismas
tablas de verdad que sus equivalentes lógicos, pero trabajan bit a bit.
p q p^q
0 0 0
0 1 1
1 0 1
1 1 0
La operación A ND pone los bits a cero, ya que cualquier bit que esté a cero en un
operando hará que el correspondiente bit de la variable se ponga a cero. Por ejemplo,
5 & 127 sería:
00000101 (5)
& 01111111 (127)
00000101
La operación O R pone los bits a uno, ya que cualquier bit del operando que esté a
uno hace que el correspondiente bit de la variable se ponga a uno. Por ejemplo, 128 |
3 sería:
10000000 (128)
| 00000011 (3)
10000011
La operación X O R pone los bits a uno, cuando los bits de los operandos son
distintos. Por ejemplo, 127 ^ 120:
01111111 (127)
^ 01111000 (120)
00000111
~ 01111011 (123)
10000100
Las operaciones de desplazamiento, >> y <<, mueven todos los bits de una variable a
la derecha o a la izquierda, respectivamente.
Por ejemplo:
x luego de
char x; la valor de x
operación
x = 7; 00000111 7
x = x << 112, multiplica por 2 4
01110000
4; = 16
x = x >>
00011100 28, divide por 2 2 = 4
2;
Por último, los operadores a nivel de bits son útiles cuando se decodifica la entrada
a través de dispositivos externos, como Conversores D/A. También, se usan en rutinas
para descifrado, cuando se quiere que el archivo aparezca ilegible; basta con llevar a
cabo en él algunas manipulaciones a nivel de bits. Uno de los métodos más sencillos es
el de complementar cada byte usando el complemento a uno para invertir cada bit del
byte, por ejemplo, el doble complemento en un byte produce el mismo valor:
a) El operador ?:
X = ( y < 0 ) ? -y : y;
Entonces, el operador ?: se usa cuando se tiene una variable que puede tomar dos
valores posibles.
b) Operadores & y *
Antes de describir estos operadores hacen falta los siguientes conceptos previos:
Tipo base del puntero. Es el tipo de dato al que apunta un puntero, en este caso
int.
m = & cont;
m = &cont;
q =*m:
q = cont;
float f;
Para la variable: sizeof f , da un valor de 4
Para el tipo: sizeof (int) , da un valor de 2
sizeof ayuda a generar códigos portables que dependen del tamaño de los tipos
de datos incorporados del lenguaje C, ya que sizeof detecta la longitud real de los
datos.
x = (y = 3, y + 1);
Los paréntesis son necesarios debido a que el operador coma tiene menor
precedencia que el operador de asignación.
Los operadores punto (.) y flecha (->) referencian elementos individuales de las
"estructuras" y de las "uniones".
Las "estructuras" y las "uniones" son tipos de datos compuestos que almacenan
distintos tipos de datos, que pueden referenciarse bajo un solo nombre.
Los paréntesis (). Son operadores que aumentan la precedencia de las operaciones
que contienen.
DESCRIPCIÓN OPERADORES
--------- ()[] -> .
unarios ! ~ ++ -- - (tipo) * & sizeof
multiplicativos */%
aditivos +-
desplazamiento << >>
relación < <= > >=
relación == !=
AND sobre bits &
XOR sobre bits ^
OR sobre bits |
AND lógico &&
OR lógico ||
condicional ?:
asignación y
= += -= *= /= %=
abreviaturas
coma ,
Observaciones:
Los operadores: unarios, condicional, de asignación y abreviaturas, se evalúan de
derecha a izquierda.
El resto de los operadores que tienen el mismo nivel de precedencia son
evaluados de izquierda a derecha.
Por supuesto, se puede utilizar paréntesis para alterar el orden de evaluación, ya que
los paréntesis fuerzan a que una operación, o un conjunto de operaciones, tengan un
nivel de precedencia mayor.
La expresión más simple es un operando aislado, donde los operandos pueden ser
constantes o variables o combinaciones de ambas. A partir del operando se pueden ir
construyendo expresiones de mayor o menor complejidad. Por ejemplo, las siguientes
expresiones son válidas:
a * (6 + c / d) / 20
9>3
x = ++q % 3
6 + ( c = 3 + 8 ) != ( 2 < 3 && 10 )
11 1
c=11 1
17
NOTA: El estándar ANSI estipula que las subexpresiones (entre paréntesis) de una
expresión, pueden ser evaluadas en cualquier orden.
Por ejemplo:
x = (a + b) * (c + d);
a=3;
x = (a++ - 8) * (a - 6);
10
15
Existen dos formas de conversión de tipos: Automática y Moldes (Casting), las cuales
se describen a continuación:
2.13.1. Automática
long double
double
float
unsigned long int
long int
unsigned int
int
unsigned char
char
El proceso puede ser una "promoción de tipo" o una "pérdida de rango", según sea
la categoría de la variable a asignar.
int i;
char ch;
float f;
ch =i;
f = ch;
char ch;
int i;
float f;
double d;
(ch / i) + (i * f) --‐ (f + d)
float
float
double
double
(tipo) expresión
donde:
--‐ tipo, es uno de los tipos estándares del lenguaje C.
--‐ expresión, es una expresión de cualquier tipo.
(float) i / j
48
BIBLIOGRAFIA
34