UNIDAD 2

Descargar como pdf o txt
Descargar como pdf o txt
Está en la página 1de 10

UNIDAD 2: Tipos de Datos.

Clasificación de los tipos de datos en C

C es considerado un lenguaje fuertemente tipeado, debido a que es muy completo en


cuanto a la variedad de tipos que posee. Los tipos de datos son muy útiles puesto que
permiten al compilador detectar errores y definir el espacio para el almacenamiento. El
siguiente esquema muestra la clasificación de los tipos de datos en C.

Tipos

Primitivos Compuestos
Arreglos

Ordinales No Ordinales Estructuras


Enteros Ordinales
Flotantes
Clases
Caracteres Cadenas

Tipos de datos Primitivos

Enteros

Se utilizan para representar cantidades numéricas sin parte decimal, usualmente


empleados para contar. Se definen con “int” y admiten de forma opcional dos prefijos
modificadores:

 “short” y “long”: Modifica el tamaño en bits del entero. Existen por tanto tres tipos
de enteros: “int”, “short int” (que se puede abreviar como “short”), y “long
int” (que se puede abreviar como “long”).
o El lenguaje C no define tamaños fijos para sus tipos de datos básicos. Lo
único que garantiza es que un short int tiene un tamaño menor o igual que
un int y este a su vez un tamaño menor o igual a un long int. Esta
característica del lenguaje ha complicado la creación de programas que sean
compatibles entre varias plataformas.
 “unsigned”: define un número natural (mayor o igual a cero).

Debido a que estos valores se representan en la memoria interna en forma binaria,


y recordando que en cada bit se pueden almacenar 2 posibles valores (cero o uno)
por cada bit disponible se multiplica por 2, es decir en N bits se almacenan 2N
posibles valores, que van desde cero hasta 2N-1. El estándar más utilizado maneja los
siguientes rangos

Tipo Formato rango


Int 16 bits con signo -32768 hasta 32767
Short o short int 8 bits con signo -128 hasta 127
Long o long int 32 bits con signo -2147483648 hasta 2147483647
Unsigned o unsigned int 16 bits sin signo 0 hasta 65535

Rebalse de Enteros

Esta limitación en cuanto al rango de almacenamiento en bits produce una condición


conocida como rebalse de enteros. Es el evento que ocurre cuando se trata de almacenar
un valor superior o inferior a la capacidad en bits que se tiene para ese tipo de datos; en
este caso lenguaje C, generará una advertencia puesto que siempre va a producir un valor
en el rango permitido. Veamos en un ejemplo.

Sea la declaración

short int num; y la asignación

num = 131;

al invocar la sentencia de salida :

cout >> num;

Es de pensar que el resultado mostrado en pantalla sería 131, sin embargo en la pantalla
aparecerá el valor -125, pues se produce un rebalse de enteros.

Al definir la variable num del tipo short int, el formato es de 8 bits con signo, es decir un bit
para el signo y quedan 7 para el número, 27 que sería 128 valores negativos (con el bit 1
por delante, desde el -128 hasta el -1) y 128 valores positivos (con el bit 0 por delante,
desde 0 hasta el 127), pero como el número 131, excede en 4 unidades al máximo valor
positivo que es 127, los cuatro valores restantes que hacen la diferencia, serán recorridos
desde el valor más pequeño hacia adelante, es decir, -128, -127, -126, -125. Siendo este el
resultado final. De manera similar ocurre con un valor muy pequeño, lenguaje C tomaría la
diferencia desde los valores más altos. Esto ocurre para todos los tipos de enteros.

Caracteres

Las variables de tipo letra se declaran como “char”. Para referirse a una letra se rodea de
comillas simples: 'M'. Las letras, o cualquier símbolo del teclado, se representan
internamente como números, para tal fin, lenguaje C asigna un espacio de 8 bits, lo que
produce un rango de 28 posibles valores, es decir 256 caracteres.

Para esta representación, el computador usa un valor numérico para cada símbolo del
teclado (letras, dígitos, espacios, caracteres especiales, signos de puntuación, etc.). Para
estandarizar esto a nivel mundial, y poder ser utilizado sin inconvenientes en cualquier
sistema se crean tablas estándar donde está el valor numérico asignado a cada tecla
(llamado ordinal) y su símbolo correspondiente. Tal tabla es llamada ASCII, siendo
complementada en la actualidad por una versión más moderna llamada UNICODE. Algunas
de las representaciones son las siguientes.

Ordinal Char Ordinal Char Ordinal Char


48 0 64 @
49 1 65 A 97 a
50 2 66 B 98 b
51 3 67 C 99 c
52 4 68 D 100 d
53 5 69 E 101 e
54 6 70 F 102 f
55 7 .. …
56 8
57 9

La asignación de valores numéricos permite la posibilidad de hacer un ordenamiento


alfabético, respetando como observan, el hecho de que A es menor que B, y B menor que
C, etc. Incluso se tomó la precaución de colocar mayúsculas y minúsculas a la misma
distancia (32 caracteres), de tal forma que se puede llevar una carácter de mayúscula a
minúscula, sumándole 32. (para hacer lo contrario se restarían 32)

Es importante destacar que este almacenamiento numérico es transparente para el


usuario, si usted almacena la letra H, el computador mostrará la letra H, a menos que usted
desee ver el valor ordinal. Esto lo aprenderemos más adelante.

Flotantes

Se utilizan para representar números reales, es decir cantidades numéricas con parte
decimal, tanto positivas como negativas, útil en la representación de pesos, distancias,
unidades monetarias, entre otros.

El nombre de flotante deriva de su forma de representar el número en memoria, es decir


notación de punto flotante, el valor se representa en dos partes, la coma decimal “flota”,
haciendo una representación en notación científica. Esto hace posible almacenar un mayor
rango de valores.
El número se representa en dos partes. Mantisa y exponente, por lo que se guarda en
memoria la mantisa o fracción decimal y la potencia de 10 a la que debe ser elevado el
número.

Ejemplo: El número es 17542,50; En notación científica es 1,75425 x 104, se almacena en la


mantisa 1,75425 con su signo positivo y en exponente el número 4, con signo positivo.

Para el número 0,0000873, cuya notación científica es 8,73 x 10-5, se almacena en la


mantisa 8,73 con signo positivo y en exponente el número 5 con signo negativo.

Los números reales se definen con “float” o “double”. La diferencia entre ambas es la
precisión que ofrece su representación interna. Hay un número infinito de reales, pero se
representan con un número finito de bits. A mayor número de bits, mayor número de
reales se representan, y por tanto, mayor precisión. Los reales definidos
con “double” tienen un tamaño doble a los definidos con “float”. Al igual que en el caso de
los enteros, el tamaño de estas representaciones varía de una plataforma a otra.

Tipo Bits mantisa exponente


float 32 24 8
double 64 48 16

Overflow/underflow

Este evento ocurre cuando tratamos de almacenar un valor superior a la capacidad en bits
que se tiene para ese tipo de datos, similar al rebalse de enteros, pero en este caso con
números flotantes o reales. Cuando se excede el valor máximo, la variable tomará el valor
máximo, sin pasar de allí. Cuando se trata de almacenar un dato inferior al valor mínimo, se
tomará el valor cero.

Cadenas

Una cadena es un conjunto de variables de caracteres que forman una unidad, también es
conocido por su nombre en inglés string. Se obtiene definiendo la variable de tipo char y
colocando luego del nombre del identificador, el número de caracteres que posee
encerrado en corchetes. Ejemplo
Char Cadena[10]; permite definir una variable donde se pueden almacenar hasta 10
caracteres.

Operadores

Los operadores son los símbolos que permiten hacer transformaciones y operaciones con
los datos. Lenguaje C maneja 3 tipos de operadores básicos.
 Aritméticos
 Relacionales
 Lógicos

El tipo de operador está ligado al tipo de resultado que se puede obtener y al orden o
prioridad en que se realizan las operaciones.

Operadores Aritméticos

Permiten realizar operaciones de suma, resta, multiplicación y división, usando los


respectivos símbolos +, -, * y /. Trabajan con variables numéricas (enteras o reales)
considerando que el resultado obtenido dependerá del tipo de dato involucrado. Si se
utilizan datos enteros, los resultados obtenidos son enteros, si se utilizan datos flotantes,
los resultados son flotantes, y si se combinan ambos tipos, el resultado será flotante.

Las operaciones de multiplicación y división tienen igual prioridad, y se realizan antes que
las operaciones de suma y resta. Si se combinan dos operaciones de igual prioridad, se
comienza a resolver de izquierda a derecha. La única forma de alterar esa prioridad, es el
uso de paréntesis, en cuyo caso se resuelve primero el más interno, se continúa con
multiplicaciones y divisiones y finalmente sumas y restas. No se usan corchetes ni llaves
como signos de agrupación.

Prioridades

 ()
 *, /
 +, -

Operador Módulo

El operador módulo, representado con el símbolo de porcentaje % permite obtener el


residuo de una división, solamente opera con datos enteros y el resultado es entero. Por
ejemplo: 15 % 4 da como resultado 2. 10 %2 da como resultado 0, mientras que 10 / 2 nos
da 5. Finalmente 4 % 7 es 4, pues al no poder dividir 4 entre 7, el residuo es el mismo
cuatro, que es la cantidad sobrante, es decir lo que no se pudo dividir.

Por ser una división, tiene la misma prioridad que * y /, y no trabaja con flotantes. De esta
forma las prioridades quedan así:

Prioridades

 ()
 *, /,%
 +, -
Operadores Relacionales

Permiten establecer la relación entre 2 valores para obtener un resultado cierto o falso. La
relación de comparación de 2 valores tiene seis posibles combinaciones, a continuación se
presenta cada una, y su notación tanto matemática como en lenguaje C.

Relación Notación
Matemática Lenguaje C
Mayor que > >
Mayor o igual que ≥ >=
Menor que < <
Menor o igual que ≤ <=
Igual = ==
diferente ≠ !=

Note que la igualdad y la doble igualdad representan acciones diferentes, la primera se


utiliza para asignar o almacenar y la segunda para comparar dos expresiones y obtener un
resultado verdadero o falso.
A nivel de prioridad, los operadores relacionales se resuelven después de los aritméticos,
comenzando con >,>=,<, <= que tienen igual prioridad y luego == y !=. La tabla de
prioridades quedará así:

Prioridades

 ()
 *, /,%
 +, -
 >,>=,<, <=
 == y !=

En lenguaje C, un resultado verdadero equivale al número uno (1), mientras que un


resultado falso equivale a cero (0)

Operadores Lógicos

Trabajan con operandos (datos) verdaderos o falsos y sus resultados son verdaderos o
falsos. Sus operaciones fueron definidas por Jhon Boole, por eso también son llamados
booleanos. El algebra de boole contempla varias operaciones, manejaremos aquí las más
difundidas:
Operador Or

El operador Or, representado por “||” equivale a “O inclusivo”; devuelve true


(verdadero) si cualquiera de las expresiones evaluadas es true, o distinta de cero, en
caso contrario devuelve false (falso).

Operador And

El operador And, representado por “&&” equivale a “Y”; devuelve true sólo si los dos
operandos son true o lo que es equivalente, distintas de cero. En cualquier otro caso el
resultado es false.

Operador Not

El operador Not, representado por “!” es equivalente al negación o “NO”, y devuelve


true cuando la expresión evaluada es false o cero, en caso contrario devuelve false.

El operador Not, posee una prioridad muy alta, luego de los paréntesis, mientras que el
And y el Ord, en ese mismo orden, se resuelven después de los operadores
relacionales. Así quedaría la tabla

Prioridades

 ()
 !
 *, /,%
 +, -
 >,>=,<, <=
 == y !=
 &&
 ||
Lenguaje C puede manejar los operadores lógicos como numéricos y los numéricos como
lógicos, dependiendo del contexto de la expresión. Ejemplo.

Int X = 5, Y = 0,Z;

Z = X* 3 > !Y; en este caso multiplica primero 3 *5, resultado 15 y compara si 15 es


mayor que !Y , Y es 0, por lo tanto al negarlo con el símbolo !, es considerado como
falso, la negación de falso es verdadero. Pero como estamos comparando 15 >
verdadero, que es un valor lógico, lenguaje c lo vuelve a convertir en número, en este
caso 1 que es igual a verdadero. En conclusión compara si 15 >1, este resultado es
verdadero. Finalmente al almacenarlo, que es la última operación almacena en la
variable Z el numero 1, que equivale a verdadero.

La última prioridad la tiene es la sentencia de asignación, es decir lo último que se hace


es guardar el resultado en la variable de la izquierda.

Otros operadores

Operadores de Asignación

Permiten colocar una expresión en forma abreviada, con única la intención de escribir
menos código. Se aplica cuando tenemos una expresión de la forma:

Variable = Variable Operador Expresión (Forma explícita), se puede escribir de la forma:

Variable Operador = Expresión (Forma implícita), de esta manera se ahorra escribir una
vez el nombre de la variable. Ejemplo:

Total = Total / Saldo; se escribiría Total/=Saldo;

Costo = Costo + Precio * Descto; se escribiría Costo+=Precio * Descto.

Es importante tomar en cuenta que cuando tenemos una expresión abreviada (forma
implícita) y la queremos expandir (forma explícita), el operador afecta a todo el lado
derecho de la expresión, por lo que se recomienda el uso de paréntesis. Ejemplo

Valor/=Cuota-Número; debe expandirse así: Valor = Valor /(Cuota – Numero); y no de la


forma Valor = Valor / Cuota – Numero; En la primera forma primero resta Numero de
Cuota y luego divide Valor entre esta resta (forma correcta) mientras que en la segunda
Divide Valor entre Cuota y luego resta Numero (forma incorrecta).

Prioridades

 ()
 !
 *, /,%
 +, -
 >,>=,<, <=
 == y !=
 &&
 ||
 +=, -=, *=, /=, %=
 =

Operadores de Autoincremento y Autodecremento

Simplemente se utilizan para incrementar o decrementar en una unidad, variables


ordinales (enteros o char), es decir obtener el sucesor o predecesor.

a) Autoincremento: La expresión Cont = Cont +1; equivale a Cont++; ó ++Cont;

b) Autodecremento: La expresión Num = Num - 1; equivale a Num--; ó --Num;

En la línea a) encontramos tres formas de sumar uno a la variable Cont, en la línea b), tres
formas de restar uno variable Num.

Encontramos acá un elemento que es muy importante, que es el modo, aunque no afecta
la operación de cálculo, incide significativamente en el orden de prioridad lo que puede
afectar el resultado final.

El modo está asociado a la ubicación del símbolo ++ ó --, delante o detrás de la variable.

Modo Prefijo: ++Variable ó - - Variable. Se modifica primero la variable (bien sea sumar o
restar uno) y luego se utiliza este resultado para resolver la expresión.

Modo Postfijo: Variable++ ó Variable- -. Se resuelve la expresión con el valor actual de la


variable y luego se modifica la variable (bien sea sumar o restar uno).

Esto trae como consecuencia que el modo prefijo tiene una muy alta prioridad (junto con el
operador !) y el modo postfijo la más baja prioridad (después de asignar =)

Ejemplo: A continuación se presenta un código empleando el modo prefijo se muestran los


resultados
#include <stdio.h>
#include <iostream.h>
void main()
{
int a, b;
a = 25;
b = ++a/2;
cout << “a = ”<< a <<” b = ” b ;
}

Se producen los siguientes resultados: se asigna el valor de 25 a la variable a, en la línea


identificada con el color azul, siguiendo las prioridades primero el prefijo, se incrementa el
valor de a al valor 26, se divide 26/2 y este resultado = 13, se almacena en b. Es Decir
primero prefijo ++, luego división y finalmente almacenar en b. La salida es: a = 26 b = 13.

Ahora mostraremos el mismo código pero utilizando el modo postfijo en la variable a.

#include <stdio.h>
#include <iostream.h>
void main()
{
int a, b;
a = 25;
b = a++/2;
cout << “a = ”<< a <<” b = ” b ;
}

Se producen los siguientes resultados: se asigna el valor de 25 a la variable a, en la línea


identificada con el color azul y siguiendo las prioridades, primero se divide el valor de a
entre 2, es decir 25/2 este resultado es 12 (realmente es 12.5 pero como es entero toma
12), seguidamente se almacena este valor 12 en la variable b, finalmente se hace el
postfijo, es decir el valor de la variable a, pasa de 25 a 26. Es Decir primero división, luego
almacenar en b y finalmente, después de guardar, incrementar a. La salida es: a = 26 b = 12.
Finalmente la tabla de prioridades queda así:

 ()
 !, ++,-- prefijo
 *, /,%
 +, -
 >,>=,<, <=
 == y !=
 &&
 ||
 +=, -=, *=, /=, %=
 =
 ++, -- postfijo

También podría gustarte