04. Primitivas-Literales.pdf
Document Details
Uploaded by IndulgentCitrine
MIUMG
Tags
Full Transcript
Tipos Primitivos y Variables VARIABLES Y TIPOS BÁSICOS ◦ Los tipos son fundamentales para cualquier programa: nos dicen cuáles son los datos, que significan y qué operaciones se pueden realizar con esos datos. ◦ C++ tiene un amplio soporte para tipos de datos. ◦ El lenguaje define varios ti...
Tipos Primitivos y Variables VARIABLES Y TIPOS BÁSICOS ◦ Los tipos son fundamentales para cualquier programa: nos dicen cuáles son los datos, que significan y qué operaciones se pueden realizar con esos datos. ◦ C++ tiene un amplio soporte para tipos de datos. ◦ El lenguaje define varios tipos primitivos (caracteres, números enteros, números de punto flotante, etc.) y proporciona mecanismos que permiten definir tipos de datos definidos por el programador. ◦ La biblioteca utiliza estos mecanismos para definir otros tipos como cadenas de caracteres de longitud variable, vectores, etc. Tipos Integrados Primitivos ◦ C++ define un conjunto de tipos primitivos que incluyen los tipos aritméticos y un tipo especial llamado void. ◦ Los tipos aritméticos representan caracteres, números enteros, valores booleanos y números de punto flotante. ◦ El tipo void no tiene valores asociados y se puede utilizar sólo en algunas circunstancias, más comúnmente como el tipo de devolución para funciones que no devuelven un valor. Tipos aritméticos ◦ Los tipos aritméticos se dividen en dos categorías: tipos enteros (que incluyen tipos de caracteres y booleanos) y tipos de punto flotante. ◦ El tamaño (es decir, el número de bits) de los tipos aritméticos varía según la arquitectura de la computadora. ◦ El estándar garantiza los tamaños mínimos que se enumeran en la tabla. ◦ Sin embargo, los compiladores pueden utilizar tamaños más grandes para estos tipos. Porque el número de los bits varían, el valor más grande (o más pequeño) que un tipo puede representar también varía. Tipos aritméticos Tipos aritméticos ◦ El tipo bool representa los valores de verdad verdadero y falso. ◦ Hay varios tipos de caracteres, la mayoría de los cuales existen para apoyar la internacionalización. ◦ El tipo de carácter básico es char. ◦ Se garantiza que un char será lo suficientemente grande como para contener valores numéricos correspondientes a los caracteres del conjunto de caracteres básicos de la máquina. ◦ Es decir, un carácter tiene el mismo tamaño que un único byte de máquina. Tipos aritméticos ◦ Los tipos de caracteres restantes (wchar_t, char16_t y char32_t) se utilizan para conjuntos de caracteres extendidos. ◦ Se garantiza que el tipo wchar_t es lo suficientemente grande como para contener cualquier carácter en el conjunto de caracteres extendido más grande de la máquina. ◦ Los tipos char16_t y char32_t están destinados a caracteres Unicode. (Unicode es un estándar para representar caracteres utilizados prácticamente en cualquier lenguaje natural). Tipos aritméticos ◦ Los tipos enteros restantes representan valores enteros de (potencialmente) diferentes tamaños. ◦ El lenguaje garantiza que un int será al menos tan grande como un short, un long al menos tan grande como un int y un long long al menos tan grande como long. El tipo long long fue introducido por el estándar C++ 11. Tipos aritméticos ◦ Los tipos de punto flotante representan valores de precisión simple, doble y extendida. ◦ El estándar especifica un número mínimo de dígitos significativos. ◦ La mayoría de los compiladores proporcionan más precisión que el mínimo especificado. ◦ Normalmente, los flotantes se representan en una palabra (32 bits), los dobles en dos palabras (64 bits) y los dobles largos en tres o cuatro palabras (96 o 128 bits). ◦ Los tipos flotante y doble normalmente producen alrededor de 7 y 16 dígitos significativos, respectivamente. Tipos aritméticos ◦ El tipo doble largo se utiliza a menudo como una forma de acomodar hardware de punto flotante de propósito especial; es más probable que su precisión varíe de una implementación a otra. REPRESENTACIÓN A NIVEL DE MÁQUINA DE LOS TIPOS PRIMITIVOS ◦ Las computadoras almacenan datos como una secuencia de bits, cada uno con un 0 o un 1, como, por ejemplo 00011011011100010110010000111011... ◦ La mayoría de las computadoras manejan la memoria como fragmentos de bits de tamaños que son potencias de 2. ◦ El fragmento más pequeño de memoria direccionable se denomina "byte". ◦ La unidad básica de almacenamiento, normalmente una pequeña cantidad de bytes, se denomina "palabra". REPRESENTACIÓN A NIVEL DE MÁQUINA DE LOS TIPOS PRIMITIVOS ◦ En C++, un byte tiene al menos tantos bits como los necesarios para contener un carácter en el conjunto de caracteres básico de la máquina. En la mayoría de las máquinas, un byte contiene 8 bits y una palabra tiene 32 o 64 bits, es decir, 4 u 8 bytes. ◦ La mayoría de las computadoras asocian un número (llamado “dirección”) con cada byte de la memoria. ◦ En una máquina con bytes de 8 bits y palabras de 32 bits, podríamos ver una palabra de memoria de la siguiente manera: Tipos Signed y Unsigned ◦ Excepto bool y los tipos de caracteres extendidos, los tipos enteros pueden estar signed o unsigned. Un tipo con signo representa números negativos o positivos (incluido el cero); un tipo sin signo representa sólo valores mayores o iguales a cero. ◦ Los tipos int, short, long y long long están todos signed. ◦ Obtenemos el tipo sin firmar correspondiente agregando unsigned al tipo, como unsigned long. Tipos Signed y Unsigned ◦ A diferencia de los otros tipos de enteros, existen tres tipos de caracteres básicos distintos: char, char con signo y char sin signo. ◦ En particular, char no es el mismo tipo que char con signo. ◦ Aunque existen tres tipos de caracteres, sólo hay dos representaciones: signed y unsigned. El tipo char (simple) utiliza una de estas representaciones. ◦ Cuál de las otras dos representaciones de caracteres es equivalente a char depende del compilador. Tipos Signed y Unsigned ◦ En un tipo sin signo, todos los bits representan el valor. Por ejemplo, uno de 8 bits. ◦ El carácter sin firmar puede contener valores de 0 a 255 inclusive. ◦ El estándar no define cómo se representan los tipos con signo, pero sí especifica que el rango debe dividirse equitativamente entre valores positivos y negativos. ◦ Por lo tanto, se garantiza que un carácter con signo de 8 bits podrá contener valores desde –127 hasta 127; la mayoría de las máquinas modernas utilizan representaciones que permiten valores desde –128 hasta 127. Tipos Signed y Unsigned Tipos primitivos de Datos en C++ Expresados en bits A más bits valores más altos pueden ser representados A más bits mayor espacio de disco es requerido Tipos primitivos de Datos en C++ Tipos de enteros Tipos primitivos de Datos en C++ Coma flotante Utilizados para representar tipos no enteros. Representando por una mantisa y un exponente (notación científica) La precisión es el número de dígitos en la mantisa. La precisión y tamaño son dependientes del compilador. Tipos primitivos de Datos en C++ Tipo Booleano Utilizado para representar verdadero o falso Cero representa falso Numero diferente de cero es verdadero Literales ◦ Un valor, como 42, se conoce como literal porque su valor es evidente por sí mismo. Cada literal tiene un tipo. La forma y el valor de un literal determinan su tipo. ◦ Literales enteros y de coma flotante. ◦ Podemos escribir un literal tipo entero usando notación decimal, octal o hexadecimal. ◦ Los literales enteros que comienzan con 0 (cero) se interpretan como octales. Aquellos que comienzan con 0x o 0X se interpretan como hexadecimales. Literales ◦ El tipo de un literal entero depende de su valor y notación. ◦ De forma predeterminada, los literales decimales están firmados, mientras que los literales octales y hexadecimales pueden ser del tipo con o sin signo. ◦ Un literal decimal tiene el tipo más pequeño de int, long o long long (es decir, el primer tipo en esta lista) en el que cabe el valor del literal. ◦ Los literales octales y hexadecimales tienen el tipo más pequeño de int, unsigned int, long, unsigned long, long long o unsigned long long en el que cabe el valor del literal. Literales ◦ Es un error utilizar un literal que sea demasiado grande para caber en el tipo relacionado más grande. ◦ No hay literales de tipo short. ◦ Aunque los literales enteros pueden almacenarse en tipos con signo, técnicamente hablando, el valor de un literal decimal nunca es un número negativo. ◦ Si escribimos lo que parece ser un literal decimal negativo, por ejemplo 42, el signo menos no forma parte del literal. El signo menos es un operador que niega el valor de su operando (literal). Literales de caracteres y cadenas de caracteres ◦ Un carácter encerrado entre comillas simples es un literal de tipo char. Cero o más caracteres encerrados entre comillas dobles son una cadena literal: ◦ 'a' // carácter literal ◦ "¡Hola Mundo!" // cadena literal ◦ El tipo de cadena literal es una matriz de caracteres constantes. ◦ El compilador agrega un carácter nulo ('\0') a cada cadena literal. ◦ De este modo, el tamaño real de una cadena literal es uno más que su tamaño aparente. Por ejemplo, el literal 'A' representa el carácter único A, mientras que el literal de cadena "A" representa una matriz de dos caracteres, la letra A y el carácter nulo. Literales ◦ Por ejemplo, podemos escribir el valor 20 de cualquiera de las siguientes tres formas: ◦ 20 ◦ 024 ◦ 0x14 Literales Secuencias de escape ◦ Algunos caracteres, como los de retroceso o de control, no tienen imagen visible. Estos caracteres no se pueden imprimir. Otros caracteres (comillas simples y dobles, signos de interrogación y barra invertida) tienen un significado especial en el lenguaje. ◦ Los programas no pueden utilizar ninguno de estos caracteres directamente. ◦ En su lugar, utilizamos una secuencia de escape para representar dichos caracteres. Una secuencia de escape comienza con una barra invertida. El lenguaje define varias secuencias de escape: Secuencias de escape ◦ Usamos una secuencia de escape como si fuera un solo carácter: std::cout