# Fundamentos de programación/Tipos de datos primitivos

* Lección 4
* Tipos de datos primitivos
Las computadoras son fundamentalmente máquinas para almacenar y procesar datos usando órdenes o comandos. Los lenguajes de programación los organizan en tipos diferentes según sus características, las características del lenguaje, la arquitectura del computador, los diferentes elementos o valores que pueden tener y las operaciones que se pueden realizar sobre ellos.
Los diferentes tipos de datos disponibles para un programador dependen de las características de la computadora para la que esté programando así como de las características del lenguaje. Sin embargo, la mayoría de los tipos disponibles se pueden clasificar en primitivos, estructurados, y definidos por el programador. Los tipos de datos primitivos son valores simples, manipulados con operaciones proporcionadas directamente por el lenguaje de programación y que normalmente se pueden representar y manipular con las herramientas disponibles en el lenguaje máquina del computador. Los tipos estructurados son agrupaciones de datos primitivos manipuladas mediante operaciones proporcionadas por el lenguaje de programación y representadas en el lenguaje máquina mediante colecciones de datos primitivos. Los tipos de datos definidos por el programador son agrupaciones de tipos de datos primitivos o estructurados pero manipulados mediante operaciones definidas por el creador del programa.
Los tipos de datos más comunes en los lenguajes de programación son los números enteros, los números reales, los carácteres, los valores lógicos y los apuntadores.

### Enteros

Los tipos de datos de números enteros son unos de los más comunes en los lenguajes de programación y corresponden a un conjunto finito de los números enteros, incluyendo los números positivos los negativos y el cero. En el código fuente de los programas se representan directamente con los dígitos del 0 al 9, precedidos de un guión para representar a los números negativos. Algunos ejemplos de valores válidos de este tipo de datos son:
| 123 | -123 | 0 | 500 | 045 | -045 |
A diferencia de los números enteros usados en las matemáticas, los números enteros de los lenguajes de programación tienen valores máximos y mínimos. Estos valores están determinados normalmente por las características de las máquinas en las que se ejecutan los programas o por el lenguaje de programación. Estos valores se pueden verificar mediante operaciones o valores especiales proporcionados por el entorno de programación y es importante tenerlos en cuenta ya que los programas pueden producir errores inesperados cuando se realizan operaciones cuyos resultados exceden la capacidad del tipo de datos. Por ejemplo, sumar o multiplicar dos números muy grandes resultará en un número negativo.

### Reales

El tipo de datos de los números reales se usa para representar números con partes decimales o números muy grandes o muy pequeños. A diferencia de los números reales en matemáticas, en los ordenadores los números reales están muy restringidos por las capacidades de las máquinas. Actualmente la técnica más extendida para representarlos utiliza el estándar IEEE 754 para aritmética en punto flotante. Esta norma establece los mecanismos para representar los números reales, comúnmente llamados números de punto flotante, y para realizar operaciones aritméticas sobre ellos.
El el código fuente de los programas estos números se pueden representar como números decimales o como números en notación de punto flotante. Los números decimales tienen una parte entera, una parte decimal, un punto como separador decimal entre ambas partes y un guión al inicio para indicar si se trata de un número negativo. La notación de punto flotante es una generalización de la notación científica y representa los números con un guión opcional para indicar si son positivos o negativos, una parte decimal o mantisa que consiste en un número compuesto de una parte entera y una decimal como los indicados anteriormente, un número entero, que puede ser positivo o negativo, para representar el exponente y la letra E para separar la mantisa del exponente.
La siguiente tabla muestra varios números en notación decimal, en notación de punto flotante y en notación científica para ayudar a entender sus diferencias.
| Notación de punto flotante | Notación científica | Notación decimal |
| 123.5E0 | $123.5\times 10^{0}$ | 123.5 |
| -4.5E12 | $-4.5\times 10^{12}$ | -4500000000000.0 |
| 4.1E-5 | $4.1\times 10^{-5}$ | 0.000041 |
| -12E0 | $-12\times 10^{0}$ | -12.0 |

### Caracteres

Las computadoras trabajan con números y para procesar texto es necesario que representen de alguna manera los diferentes caracteres que componen un texto. El tipo de datos de carácter le permite a los programadores procesar letras, números, símbolos e ideogramas (como los usados en el chino, japonés y coreano) al asociar un código numérico a cada carácter que se desea representar. Existen muchas asignaciones de códigos para representar caracteres, pero los más comunes son el código ASCII, frecuentemente soportado de forma directa por los circuitos físicos de la máquina, y el código Unicode, diseñado específicamente para soportar los caracteres usados en una gran variedad de idiomas, no solamente los de la lengua inglesa.
En el pseudocódigo usado en este proyecto de aprendizaje representaremos los datos de tipo carácter rodeados de apóstrofos para diferenciarlos del texto circundante y de otros tipos de datos. Por ejemplo el carácter z se representará como 'z' y el carácter 6 se representará como '6', lo que ayudará a diferenciarlo del número entero correspondiente: 6. Esta es una convención comúnmente usada en lenguajes de programación como C y Pascal.

### Lógicos

El tipo de datos lógico, también llamado booleano es un tipo que solo tiene dos valores posibles: verdadero y falso. Este tipo de dato se usa para realizar operaciones lógicas sobre los datos, tomar decisiones y controlar la ejecución de los programas. Su funcionamiento es equivalente a los valores verdadero y falso de la lógica proposicional. Los lenguajes de programación representan los valores de este tipo de datos de diferentes maneras (true y false, #t y #f, 1 y 0, etc.) y algunos carecen de él completamente y usan valores numéricos en su lugar. Por ejemplo, tratan al número 0 como si fuera el valor falso y a cualquier otro número entero como si fuera verdadero.
En el pseudocódigo utilizado en algunos proyectos de aprendizaje se representan los valores del tipo de datos lógico con las palabras verdadero y falso.

### Apuntadores

Para procesar datos los computadores necesitan almacenarlos en su memoria. Los programas suelen indicar parte de la memoria que requieren antes de iniciar su ejecución usando variables, pero generalmente no es posible predecir la cantidad total de memoria que será necesaria. Para tener acceso a la memoria extra necesaria, deben solicitarla al sistema operativo durante su ejecución y deben disponer de un medio para poder llegar a ella una vez que ha sido asignada, así como para indicar que ya no es necesaria y puede ser regresada al sistema operativo del computador para asignarla a otras tareas. Los apuntadores son un tipo de datos que permite realizar esas tareas. Consisten en direcciones a posiciones de memoria y cuando el sistema operativo le asigna memoria a un programa, le entrega un apuntador o dirección a la sección de memoria asignada. Posteriormente el programa puede usar el apuntador para «llegar» a la memoria asignada y almacenar datos en ella o para recuperar datos que ha almacenado previamente.
Los apuntadores son muy útiles porque permiten compartir información fácilmente entre diferentes secciones de un programa y crear estructuras de datos complejas pero no existen explícitamente en todos los lenguajes de programación. Muchos lenguajes de programación modernos tienen sistemas automáticos de administración de memoria que le ocultan el manejo de punteros a los programadores con el fin de facilitar la creación de programas y reducir la cantidad de defectos en las aplicaciones debidos a un mal manejo de la memoria. La mayoría de los lenguajes de programación modernos usan esta técnica.

### Conversiones entre tipos de datos

Los lenguajes de programación proporcionan operaciones para procesar los valores de cada uno de los tipos de datos que definen y estas operaciones solo se pueden aplicar sobre el conjunto de valores válidos para ese tipo de datos. Por ejemplo una operación para sumar números enteros solo se puede aplicar sobre valores válidos para el tipo de datos «enteros» y no se puede usar para sumar caracteres; una operación para calcular la conjunción de dos valores lógicos solo se puede aplicar sobre valores de verdad y no sobre apuntadores; etc.
Sin embargo, muchas tareas comunes de programación requieren operar sobre valores de diferentes tipos de datos. Por ejemplo, si deseamos sumar un número entero con un número real (como 12 y 3.5). Para poder realizar esas operaciones es necesario convertir los valores de un tipo de datos a otro, por ejemplo convertir el entero 12 en el número real 12.0. Los lenguajes de programación permiten realizar estas conversiones de forma explícita o implícita. Las conversiones explícitas las solicita el programador en el código usando los mecanismos proporcionados por el lenguaje. Las conversiones implícitas las realiza automáticamente el compilador cuando está transformando el código fuente en código máquina.
Independientemente del mecanismo utilizado para realizar la conversión, es necesario ser cuidadosos al mezclar valores de tipos de datos diferentes, ya que los resultados pueden no ser los esperados debido a la representación interna que hace el lenguaje de programación de esos valores. Por ejemplo, si tenemos el carácter '9' y tratamos de sumarlo con un número entero como el 12 normalmente obtendremos, si el lenguaje de programación permite realizar esa operación, el número entero 69 ya que el código ASCII para representar ese carácter es el 57.

## Resumen de la lección

* Los tipos de datos primitivos son conjuntos de valores simples procesados por operaciones definidas por el lenguaje de programación.
* Los tipos de datos estructurados son agrupaciones de tipos de datos simples procesados por operaciones definidas por el lenguaje de programación.
* Los tipos de datos definidos por el programador son manipulados por operaciones también definidas por el programador.
* Los tipos de datos primitivos frecuentemente incluyen los números enteros, los números reales, los carácteres, los datos lógicos y los apuntadores.
* Los valores de un tipo de datos se pueden convertir explícita o implícitamente en valores de otro tipo para realizar operaciones que los combinan.

## Términos clave

* Apuntador
* Carácter
* Coma flotante
* Conversión de tipos
* IEEE 754
* Tipo de dato
* Tipo de dato entero
* Tipo de dato lógico
* Tipo de dato real

## Lecturas adicionales

* Datos y Tipos de Datos

## Bibliografía

* 1 2 3 4 5 6 Joyanes Aguilar, Luis (2013). Fundamentos generales de programación (1.ª edición). Ciudad de México, México: McGraw Hill. p. 368. ISBN 978-607-15-0818-8.
* 1 2 3 4 5 6 7 8 9 10 11 Appleby, Doris; Vandekopple, Julius J. (1998). Programming Languages: Paradigm and practice [Lenguages de programación: Paradigma y práctica] (1.ª edición). México D. F., México: McGraw Hill. p. 492. ISBN 970-10-1945-8.
* ↑ Tassel, Dennie Van (2 de febrero de 2007). «Literals in Programming Languages». Gavilan College (en inglés). Consultado el 25 de mayo de 2016.
* 1 2 «Introduction to memory management». Memory Management Reference (en inglés). Ravenbrook Limited. 2016. Consultado el 24 de mayo de 2016.
* ↑ Parlante, Nick (2000). «Pointers and Memory» (PDF). Stanford CS Education Library (en inglés). Consultado el 23 de mayo de 2016.
* Proyecto: Fundamentos de programación
* Anterior: Primera evaluación parcial — Tipos de datos primitivos — Siguiente: Evaluación de la lección 4