C++

 

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 tipo int 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, boolcharintfloat o double en C++

  • Tipos definidos por el programador o suministrados por una biblioteca estándar.

    Por ejemplo, string o vector 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 un double ocupa 8 bytes. Sin embargo, el equivalente al double en Python, el tipo float 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 (intdoublechar, etc.) y otros tipos más sofisticados.

    Un bloque de memoria asociado a un tipo fundamental en C++ se caracteriza por:

    1. El número de celdas (bytes) que lo componen es fijo.

    2. Las celdas son contiguas.

    3. 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

truefalse

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.5e81.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