Espacios de nombres
Variantes
Acciones

Tipos fundamentales

De cppreference.com
< cpp‎ | language

(Véase también tipos para un resumen del sistema de tipos y la lista de utilerías relacionadas con tipos que se suministran por la biblioteca de C++)

Contenido

[editar] Tipo void

void - Un tipo con un conjunto de valores vacío. Es un tipo incompleto que no puede completarse (consecuentemente, objetos de tipo void no se permiten). No existen arrays de void, ni referencias a void. Sin embargo, se permiten punteros a void y funciones que devuelven tipo void (procedimientos en otros lenguajes).

[editar] std::nullptr_t

Definido en el archivo de encabezado <cstddef>
typedef decltype(nullptr) nullptr_t;
(desde C++11)

std::nullptr_t es el tipo literal de puntero nulo, nullptr. Es un tipo distinto que no es en sí mismo un tipo puntero o un tipo puntero a miembro. Sus valores son la constante de puntero nulo (véase NULL), y puede ser convertido implícitamente a cualquier puntero y puntero a tipo miembro.

sizeof(std::nullptr_t) es igual a sizeof(void *).

[editar] Modelos de datos

Las elecciones hechas por cada implementación sobre los tamaños de los tipos fundamentales, se conocen colectivamente como modelos de datos. Cuatro modelos de datos fueron ampliamente aceptados:

Sistemas de 32 bits:

  • LP32 or 2/4/4 (int es de 16 bits, long y puntero son de 32 bits)
  • Win16 API
  • ILP32 or 4/4/4 (int, long, y puntero son de 32 bits);
  • Win32 API
  • Unix y sistemas similares a Unix (Linux, macOS)

Sistemas de 64 bits:

  • LLP64 or 4/4/8 (int y long son de 32 bits, puntero es de 64 bits)
  • Win64 API
  • LP64 or 4/8/8 (int es de 32 bits, long y puntero son de 64 bits)
  • Unix y sistemas similares a Unix (Linux, macOS)

Otros modelos son muy raros. Por ejemplo, ILP64 (8/8/8: int, long, y puntero son de 64 bits) solamente aparecieron en algunos modelos de sistemas iniciales de Unix de 64 bits (p. ej., UNICOS en Cray).

[editar] Tipos enteros con signo y sin signo

int - El tipo entero básico. La palabra clave int puede omitirse si se usa cualquiera de los modificadores listados abajo. Si no se encuentran presentes modificadores de longitud, se garantiza que tendrá al menos una anchura de 16 bits. Sin embargo, en sistemas de 32/64 bits, casi siempre se garantiza que tendrá una anchura de al menos 32 bits (véase abajo).

[editar] Modificadores

Modifica el tipo entero. Pueden mezclarse en cualquier orden. Solamente uno de cada grupo puede estar presente en el nombre del tipo.

Signo

signed - El tipo de destino tendrá una representación con signo (este es el modificador por defecto si se omite).
unsigned - El tipo de destino tendrá una representación sin signo.

Tamaño

short - El tipo de destino se optimizará por espacio y tendrá una anchura de al menos 16 bits.
long - El tipo de destino tendrá una anchura de al menos 32 bits.

long long - El tipo de destino tendrá al menos una anchura de 64 bits.
(desde C++11)

Nota: al igual que todos los especificadores de tipo, se permite cualquier orden: unsigned long long int y long int unsigned long se refieren al mismo tipo.

[editar] Propiedades

La siguiente tabla resume todos los tipos enteros disponibles y sus propiedades en varios modelos de datos comunes:

Especificador de tipo Tipo equivalente Anchura en bits por el modelo de datos
C++ standard LP32 ILP32 LLP64 LP64
short
short int al menos
16
16 16 16 16
short int
signed short
signed short int
unsigned short
unsigned short int
unsigned short int
int
int al menos
16
16 32 32 32
signed
signed int
unsigned
unsigned int
unsigned int
long
long int al menos
32
32 32 32 64
long int
signed long
signed long int
unsigned long
unsigned long int
unsigned long int
long long
long long int
(C++11)
al menos
64
64 64 64 64
long long int
signed long long
signed long long int
unsigned long long
unsigned long long int
(C++11)
unsigned long long int

Nota: la aritmética de enteros se define de manera diferente para los tipos enteros con signo o sin signo. Véase operadores aritméticos, en particular desbordamiento de enteros.

std::size_t es el tipo entero sin signo del resultado del operador sizeof así como del operador sizeof... y el operador alignof (desde C++11).

Véase también Tipos enteros de anchura fija.

(desde C++11)

[editar] Tipo booleano

bool - Un tipo capaz de mantener uno de dos valores: true o false. El valor de sizeof(bool) está definido por la implementación y puede diferir de 1.

[editar] Tipos carácter

signed char - El tipo para la representación de caracteres con signo.
unsigned char - El tipo para la representación de caracteres sin signo. También se usa para inspeccionar las representaciones de objetos (memoria sin formato).
char - El tipo para la representación de caracteres que pueden ser procesados más eficientemente en el sistema de destino (tiene la misma representación y alineación que signed char o unsigned char, pero es siempre un tipo distinto). Las cadenas de caracteres multibyte utilizan este tipo para representar unidades de código. Para cada valor de tipo unsigned char en el rango [0, 255], convertir el valor a char y de nuevo a unsigned char produce el valor original. (desde C++11) El signo de char depende del compilador y la plataforma de destino: por defecto, en ARM y PowerPC es típicamente sin signo, mientras que por defecto, en x86 y x64 es típicamente con signo.
wchar_t - El tipo para la representación de caracteres anchos (véase cadenas anchas). Se requiere que sea lo suficientemente grande para representar cualquier punto de código de carácter soportado (32 bits en sistemas que apoyan Unicode. Una excepción notable es Windows, donde wchar_t es de 16 bits y alberga unidades de código UTF-16) Tiene el mismo tamaño, signo y alineación que uno de los tipos enteros, pero es un tipo distinto.

char16_t - El tipo para la representación de caracteres UTF-16, se requiere que sea lo suficientemente grande para representar cualquier unidad de código UTF-16 (16 bits). Tiene el mismo tamaño, signo y alineación que std::uint_least16_t, pero es un tipo distinto.

char32_t - El tipo para la representación de caracteres UTF-32, se requiere que sea lo suficientemente grande para representar cualquier unidad de código UTF-32 (32 bits). Tiene el mismo tamaño, signo y alineación que std::uint_least32_t, pero es un tipo distinto.
(desde C++11)

char8_t - El tipo para la representación de caracteres UTF-8, se requiere que sea lo suficientemente grande para representar cualquier unidad de código UTF-8 (8 bits). Tiene el mismo tamaño, signo y alineación que unsigned char (y por lo tanto, el mismo tamaño y alineación que char y signed char), pero es un tipo distinto.
(desde C++20)

Además del número mínimo de bits, el estándar de C++ garantiza que

1 == sizeof(char) <= sizeof(short) <= sizeof(int) <= sizeof(long) <= sizeof(long long).

Nota: esto permite el caso extremo en el que los bytes tienen un tamaño de 64 bits, todos los tipos (incluyendo char) son de 64 bits de ancho, y sizeof devuelve 1 para todos los tipos.

[editar] Tipos de punto flotante[1]

Los siguientes tres tipos y sus versiones calificadas-cv se denominan colectivamente tipos de puntos flotante.

float - El tipo de punto flotante de simple precisión. Si se proporciona, corresponde al formato IEEE-754 binary32.
double - El tipo de punto flotante de doble precisión. Si se proporciona, corresponde al formato IEEE-754 binary64.
long double - El tipo de punto flotante de precisión extendida. Si se proporciona, corresponde al formato IEEE-754 binary128 ; de lo contrario, corresponde al formato IEEE-754 binary64-extendido si se proporciona; de lo contrario, corresponde a algún formato extendido de punto flotante que no es IEEE-754, siempre y cuando su precisión sea mejor que binary64 y el rango sea al menos tan bueno como el de binary64; de lo contrario, corresponde al formato IEEE-754 binary64.
  • El formato binary128 se usa por algunas implementaciones de HP-UX, SPARC, MIPS, ARM64, y z/OS.
  • El formato más conocido de IEEE-754 binary64-extendido es un formato de precisión extendida de 80-bits x87 . Se usa por varias implementaciones x86 y x86-64 (una excepción notable es MSVC, que implementa long double con el mismo formato que double, es decir, binary64).

[editar] Propiedades

Los tipos de punto flotante pueden admitir valores especiales:

  • infinidad (positiva y negativa), véase INFINITY
  • el cero negativo, -0.0. Se compara igual con el cero positivo, pero es significativo en algunas operaciones aritméticas, p. ej., 1.0/0.0 == INFINITY, pero 1.0/-0.0 == -INFINITY), y para algunas funciones matemáticas, p. ej.,sqrt(std::complex)
  • no es un número (NaN), que no se compara igual con nada (incluyendo consigo mismo). Múltiples patrones de bits representan NaNs, véase std::nan, NAN. Observa que C++ no presta especial atención en indicar NaNs, excepto para detectar su apoyo por std::numeric_limits::has_signaling_NaN, y trata a todos los NaNs silenciosamente.

Los números reales de punto flotante pueden usarse con los operadores aritméticos + - / * y varias funciones matemáticas de cmath. Tanto los operadores integrados como las funciones de biblioteca pueden generar excepciones de punto flotante y establecer a errno como se describe en math_errhandling.

Las expresiones de punto flotante pueden tener mayor rango y precisión que lo que se indica por sus tipos. Véase FLT_EVAL_METHOD. Las expresiones de punto flotante también pueden ser contraídas, es decir, calculadas como si todos los valores intermedios tuvieran rango y precisión infinitos. Véase #pragma STDC FP_CONTRACT.

Algunas operaciones en números de punto flotante se afectan por el entorno de punto flotante y modifican el estado del entorno de punto flotante (más notablemente, la dirección del redondeo).

Se definen conversiones implícitas entre tipos flotantes reales y tipos enteros.

Véanse los límites de los tipos de punto flotante y std::numeric_limits para detalles adicionales, límites y propiedades de los tipos de punto flotante.

[editar] Rango de valores

La siguiente tabla proporciona una referencia para los límites de representaciones numéricas comunes.

Antes de C++20, el estándar de C++ permitía cualquier representación con signo, y el rango mínimo garantizado de enteros con signo de N-bits era de -(2N-1
-1)
a +2N-1
-1
(p. ej., -127 a 127 para un tipo de 8 bits con signo), que corresponde a los límites de complemento a uno o signo y magnitud.

Sin embargo, todos los compiladores de C++ utilizan una representación de complemento a dos, y a partir de C++20, es la única representación permitida por el estándar, con el rango garantizado de -2N-1
a +2N-1
-1
(p. ej., -128 a 127 para un tipo de 8 bits con signo).

Las representaciones de 8 bits de complemento a uno y signo y magnitud para char han sido rechazadas desde C++11 (vía CWG 1759), porque una unidad de código UTF-8 con valor 0x80 usada en un literal de cadena UTF-8 deber ser almacenable en un objeto elemento char.

Tipo Tamaño en bits Formato Rango de valores
Aproximado Exacto
carácter 8 signed -128 to 127
unsigned 0 to 255
16 unsigned 0 to 65535
32 unsigned 0 to 1114111 (0x10ffff)
entero 16 signed ± 3.27 · 104 -32768 to 32767
unsigned 0 to 6.55 · 104 0 to 65535
32 signed ± 2.14 · 109 -2,147,483,648 to 2,147,483,647
unsigned 0 to 4.29 · 109 0 to 4,294,967,295
64 signed ± 9.22 · 1018 -9,223,372,036,854,775,808 to 9,223,372,036,854,775,807
unsigned 0 to 1.84 · 1019 0 to 18,446,744,073,709,551,615
punto
flotante
binario
32 IEEE-754
  • mín. subnormal:
    ± 1.401,298,4 · 10-45
  • mín. normal:
    ± 1.175,494,3 · 10-38
  • máx.:
    ± 3.402,823,4 · 1038
  • mín. subnormal:
    ±0x1p-149
  • mín. normal:
    ±0x1p-126
  • máx.:
    ±0x1.fffffep+127
64 IEEE-754
  • mín. subnormal:
    ± 4.940,656,458,412 · 10-324
  • mín. normal:
    ± 2.225,073,858,507,201,4 · 10-308
  • máx.:
    ± 1.797,693,134,862,315,7 · 10308
  • mín. subnormal:
    ±0x1p-1074
  • mín. normal:
    ±0x1p-1022
  • máx.:
    ±0x1.fffffffffffffp+1023
80[nota 1] x86
  • mín subnormal:
    ± 3.645,199,531,882,474,602,528
     · 10-4951
  • mín normal:
    ± 3.362,103,143,112,093,506,263
     · 10-4932
  • máx:
    ± 1.189,731,495,357,231,765,021
     · 104932
  • mín subnormal:
    ±0x1p-16446
  • mín normal:
    ±0x1p-16382
  • máx:
    ±0x1.fffffffffffffffep+16383
128 IEEE-754
  • mín subnormal:
    ± 6.475,175,119,438,025,110,924,
    438,958,227,646,552,5 · 10-4966
  • mín normal:
    ± 3.362,103,143,112,093,506,262,
    677,817,321,752,602,6 · 10-4932
  • máx:
    ± 1.189,731,495,357,231,765,085,
    759,326,628,007,016,2 · 104932
  • mín subnormal:
    ±0x1p-16494
  • mín normal:
    ±0x1p-16382
  • máx:
    ±0x1.ffffffffffffffffffffffffffff
    p+16383
  1. La representación de objeto habitualmente ocupa 96/128 bits en plataformas 32/64 bits, respectivamente.

Nota: Los límites actuales (a diferencia de los mínimos garantizados) en los valores representables por estos tipos están disponibles en la interfaz de C de límites numéricos y std::numeric_limits.

[editar] Palabras clave

void, bool, true, false, char, wchar_t, char8_t, char16_t, char32_t, int, short, long, signed, unsigned, float, double

[editar] Informes de defectos

Los siguientes informes de defectos de cambio de comportamiento se aplicaron de manera retroactiva a los estándares de C++ publicados anteriormente.

ID Aplicado a Comportamiento según lo publicado Comportamiento correcto
CWG 1759 C++11 No se garantizaba que char pudiera representar una unidad de código UTF-8 0x80. Se garantizó.

[editar] Véase también

Documentación de C para Tipos aritméticos

[editar] Referencias

  1. decimales: coma y punto son signos válidos