Tipos
Los diferentes valores (enteros, reales, caracteres, vectores, listas, diccionarios, etc.) que puede manejar un lenguaje se agrupan en tipos.
Un tipo se configura a partir de:
un conjunto de valores
Por ejemplo, un conjunto formado por enteros {…,-3,-2,-1,0,1,2,3,…}
las operaciones permitidas para esos valores
Por ejemplo, para los enteros disponemos de la suma (
+
), resta (-
), división (/
), multiplicación (*
) y resto de la división entera (%
)una aplicación que asocia a cada valor del tipo una representación binaria
Por ejemplo, la representación binaria del valor
-2
con tipoint
en C/C++ es una agrupación de 32 bits:11111111111111111111111111111110
Usaremos habitualmente en el curso los siguientes tipos:
bool
para representar valores booleanos, es decir, cierto o falso.int
para representar valores enteros.double
para valores reales.char
para caracteres.string
para cadenas de caracteres.vector<tipo>
para colecciones de datos del mismo tipo.
Clasificaciones
Los comités de estandarización de cada lenguaje o diferentes autores tienen (y varían en el tiempo) su propia terminología acerca de conceptos tales como tipo primitivo, tipo nativo, tipo básico, tipo fundamental, tipo compuesto, tipo escalar, etc. por lo que la bibliografía es confusa y contradictoria.
Una forma no bizantina de clasificarlos podría ser:
Tipos nativos, proporcionados por el lenguaje, que pueden ser simples o compuestos.
Por ejemplo,
bool
,char
,int
,float
odouble
en C++Tipos definidos por el programador o suministrados por una biblioteca estándar.
Por ejemplo,
string
ovector
de la biblioteca estándar de C++Bloques de memoria
La memoria del ordenador es el almacén de los diferentes valores que se generan al ejecutar un programa.
La memoria se organiza como un conjunto de celdas, típicamente de tamaño 1 byte, cada una de ellas con una dirección asociada.
La dirección en memoria
La dirección permite acceder a la ubicación de cada celda y es un valor en si mismo y, por tanto, también puede almacenarse en otras celdas de la memoria.
Así, en lenguajes como C/C++ existe el tipo puntero (pointer) cuyos valores asociados son direcciones.
Disposición de las celdas
El bloque de memoria necesario para almacenar un valor asociado a un tipo necesitará de una determinada cantidad de celdas y una determinada disposición de éstas.
Por ejemplo, un
char
en C/C++ ocupa 1 byte y undouble
ocupa 8 bytes. Sin embargo, el equivalente aldouble
en Python, el tipofloat
ocupa ¡24 bytes! El motivo es que Python no sólo almacena la representación binaria intrínseca del número, sino otra información relevante dadas las características de este lenguaje. De esos 24 bytes, 8 bytes contendrán los mismos bits que su equivalente en C/C++.En C++, el bloque de memoria asociado a los tipos de datos nativos está formado por celdas contiguas.
Para otros tipos de datos y lenguajes, las celdas que conforman un bloque de memoria no tienen por qué ser contiguas. Pueden estar distribuidas en diferentes ubicaciones de la memoria.
Por ejemplo, el tipo de dato de C++
vector<tipo>
, utilizado para almacenar colecciones de valores de un mismo tipo, tiene sus atributos en posiciones no contiguas.Incluso el tamaño del bloque de memoria asociado a un tipo puede variar.
El tipo
int
en Python tienen un número variable de celdas, aumentando conforme lo hace el valor absoluto representado.Tipos nativos en C++
En C++ hay una clara distinción entre los tipos de datos nativos o fundamentales (
int
,double
,char
, etc.) y otros tipos más sofisticados.Un bloque de memoria asociado a un tipo fundamental en C++ se caracteriza por:
El número de celdas (bytes) que lo componen es fijo.
Las celdas son contiguas.
Hay un único valor representado, no hay información accesoria ni metadatos.
A este tipo de datos se los conoce como datos POD (Plain Old Data), tipos simples, lisos, cuya representación interna binaria se limita a codificar el valor.
C++ permite crear por parte del usuario nuevos tipos POD como agregación de otros tipos POD.
En este caso, varía el punto 3 en el sentido de que ahora el tipo agregado representa varios valores POD.
Constantes literales
Permiten almacenar en el programa un valor que permanecerá constante a lo largo de la ejecución del programa.
Las constantes literales se almacenan al ejecutarse el programa en algún lugar de la memoria que no es accesible, del que desconocemos su posición.
Se caracterizan por:
Su valor
Su tipo: entero, carácter, punto flotante, lógicos, cadena de caracteres, etc.
Internamente se almacenarán con la representación del tipo al que pertenezcan.
Estas son algunas de las constantes literales más utilizadas:
Constantes lógicas
true
,false
Constantes de tipo entero
Base decimal (10)
123
,-23745
Base hexadecimal (16)
Comienzan con 0x:
0x1fa
Base octal (8)
Comienzan con 0:
0125
Constantes reales
Punto fijo
14.487
, -.234
Exponencial
12.5e8
,1.2e-15
Constantes de tipo carácter
Rodeadas de comillas simples. Su valor se corresponde con su código ASCII.
'A'
,'\n'
Constantes de tipo cadena de caracteres
Se representan entre comillas. Son finalizadas automáticamente por el compilador en
'\0'
"Hola mundo\n"
0 Comentarios