Plantillas estándar de C++ (STL): compatibilidad con tipos (tipos básicos, RTTI, atributos de tipo)

Los objetos, las referencias, las funciones (incluidas las especializaciones de plantillas de funciones) y las expresiones tienen propiedades llamadas tipos , que restringen las operaciones permitidas en estas entidades y proporcionan significado semántico a secuencias de bits que de otro modo serían ordinarias.

Tipos básicos definidos por el lenguaje

tipo vacío

void: un tipo cuyo valor es el conjunto vacío. Es un tipo incompleto que no se puede completar (por lo que no permite voidque existan objetos de tipo). No hay ninguna voidvariedad ni voidreferencia a . Sin embargo, se permiten voidpunteros y funciones que devuelven tipos ( procedimientosvoid en otros idiomas ).

std::nullptr_t

definido en el archivo de encabezado<cstddef>

typedef decltype(nullptr) nullptr_t;

(desde C++11)

std::nullptr_t es el tipo de literal de puntero nulo nullptr. Es un tipo independiente, ni un tipo de puntero ni un tipo de puntero de miembro.

tipo booleano 

bool: un tipo suficiente para contener uno de dos valores, verdadero o falso. El valor de sizeof(bool) está definido por la implementación y puede diferir de 1

tipo entero 

int: el tipo entero básico. La palabra clave se puede omitir si se utiliza alguno de los siguientes modificadores int. Sin un modificador de longitud, se garantiza que tendrá al menos 16 bits de ancho. Sin embargo, en sistemas de 32/64 bits, se garantiza casi exclusivamente que tenga al menos 32 bits de ancho (ver más abajo).

modificador

Tipo entero modificado. Se puede mezclar en cualquier orden. Sólo puede haber un nombre de tipo por grupo.

simbólico

firmado: el tipo de destino tendrá una representación firmada (valor predeterminado si se omite)

sin firmar: el tipo de destino tendrá una representación sin firmar

tamaño

corto: el tipo de destino estará optimizado para el espacio y tendrá al menos 16 bits de ancho.

de largo: el tipo de destino tendrá al menos 32 bits de ancho.

long long: el tipo de destino tendrá al menos 64 bits de ancho.

(desde C++11)

Nota: Como ocurre con todos los especificadores de tipo, se permite cualquier orden: unsigned long long int y long int unsigned long nombre del mismo tipo.

naturaleza

La siguiente tabla resume todos los tipos de enteros disponibles y sus propiedades en varios modelos de datos de uso común:

especificador de tipo tipo equivalente Ancho de bits por modelo de datos
estándar C ++ LP32 ILP32 LLP64 LP64

corto

corto int al menos 16 dieciséis dieciséis dieciséis dieciséis

corto int

firmado corto

int corto firmado

corto sin firmar

int corto sin firmar

int corto sin firmar

En t

En t al menos 16 dieciséis 32 32 32

firmado

firmado entero

no firmado

entero sin firmar

entero sin firmar

largo

largo int Al menos 32 32 32 32 64

largo int

firmado largo

firmado int largo

largo sin firmar

int largo sin firmar

int largo sin firmar

largo largo

int largo largo
(C++11)
Al menos 64 64 64 64 64

largo largo int

firmado mucho tiempo

firmado largo largo int

sin firmar mucho tiempo

int largo largo sin firmar
(C++11)

int largo largo sin firmar

Nota: La aritmética de enteros se define de forma diferente para tipos de enteros con y sin signo. Consulte operadores aritméticos, especialmente desbordamiento de enteros.

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

Consulte tipos de enteros de ancho fijo. (desde C++11)

modelo de datos

Las elecciones que cada implementación hace con respecto al tamaño de los tipos subyacentes se denominan colectivamente modelo de datos . Hay cuatro modelos de datos ampliamente aceptados:

Sistemas de 32 bits:

  • LP32 o 2/4/4 (int es de 16 bits, long y los punteros son de 32 bits)
  • API Win16
  • ILP32 o 4/4/4 (int, long y los punteros son de 32 bits)
  • API Win32
  • Sistemas Unix y similares (Linux, Mac OS X)

Sistemas de 64 bits:

  • LLP64 o 4/4/8 (int y long son de 32 bits, los punteros son de 64 bits)
  • API Win64
  • LP64 o 4/8/8 (int es de 32 bits, long y los punteros son de 64 bits)
  • Sistemas Unix y similares (Linux, Mac OS X)

Otros modelos de datos son raros. Por ejemplo, ILP64 ( 8/8/8 : int, long y los punteros son de 64 bits) solo apareció en algunos de los primeros sistemas Unix de 64 bits (como Unicos en Cray).

 

Tipo de caracter

carácter firmado: el tipo de representación de carácter firmado.

carácter sin firmar: el tipo de representación de caracteres sin firmar. También se utiliza para inspeccionar la representación de objetos (memoria no modificada).

char: el tipo de representación de caracteres que se puede procesar de manera más eficiente en el sistema de destino (que tiene la misma representación y alineación que el char con signo o el char sin firmar, pero siempre un tipo separado). Las cadenas multibyte utilizan este tipo para representar unidades de codificación. Cada tipo de carácter es lo suficientemente grande como para representar cualquier unidad de codificación de ocho bits de UTF-8. (Desde C++14) La firma de char depende del compilador y la plataforma de destino: el valor predeterminado para ARM y PowerPC generalmente no está firmado, mientras que el valor predeterminado para x86 y x64 generalmente está firmado.

wchar_t: tipo de representación de caracteres anchos (consulte cadenas de caracteres anchos). El requisito es lo suficientemente grande como para representar cualquier sitio de codificación de caracteres compatible (32 bits en sistemas que admiten Unicode. La excepción notable es Windows, donde wchar_t es de 16 bits y conserva la unidad de codificación UTF-16). Tiene el mismo tamaño, signo y alineación que uno de los tipos de enteros, pero es un tipo independiente.

char16_t: tipo de representación de caracteres UTF-16, debe ser lo suficientemente grande para representar cualquier unidad de codificación UTF-16 (16 bits). Tiene el mismo tamaño, firma y alineación que std::uint_least16_t, pero es un tipo separado.

char32_t: tipo de representación de caracteres UTF-32, debe ser lo suficientemente grande para representar cualquier unidad de codificación UTF-32 (32 bits). Tiene el mismo tamaño, firma y alineación que std::uint_least32_t, pero es un tipo separado.

(desde C++11)

char8_t: tipo de representación de caracteres UTF-8, debe ser lo suficientemente grande para representar cualquier unidad de codificación UTF-8 (8 bits). Tiene el mismo tamaño, signo y alineación que el carácter sin firmar (y por lo tanto el mismo tamaño y alineación que el carácter y el carácter con signo), pero es un tipo separado.

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

1 == tamaño de (char) <= tamaño de (corto) <= tamaño de (int) <= tamaño de (largo) <= tamaño de (largo largo) 。

Nota: Esto permite un caso extremo donde los bytes tienen un tamaño de 64 bits, todos los tipos (incluido char) tienen 64 bits de ancho y sizeof devuelve 1 para cada tipo.

 

 tipo de coma flotante

float: tipo de punto flotante de precisión simple. Normalmente un tipo de punto flotante IEEE-754 de 32 bits

double: tipo de coma flotante de doble precisión. Normalmente un tipo de punto flotante IEEE-754 de 64 bits

long double - 扩展精度浮点类型。不必映射到 IEEE-754 所强制的类型。在 x86 和 x86-64 架构上通常为 80 位 x87 浮点类型。

性质

浮点类型支持一些特殊值:

  • 无穷(正和负),见 INFINITY
  • 负零, -0.0 。它与正零比较相等,但在某些算术运算中有意义,例如 1.0/0.0 == INFINITY ,但 1.0/-0.0 == -INFINITY) ,而且对某些数学函数有意义,例如 sqrt(std::complex)
  • 非数 (NaN) ,它与任何值(包括自身)比较都不相等。多个位模式都表示 NaN ,见 std::nan 、 NAN 。注意 C++ 并不对发信 NaN 进行特殊对待,把所有 NaN 均当做静默 NaN,但提供了 std::numeric_limits::has_signaling_NaN 用以检测它们的支持情况。

实浮点数可用于算术运算符 + - / * 和各种来自 <cmath> 的数学函数。内建运算符和库函数都可能引发浮点异常,并按 math_errhandling 中的描述设置 errno 。

浮点表达式可拥有大于其类型所指定的值域和精度,见 FLT_EVAL_METHOD 。浮点表达式亦可收缩(contract),即如同所有中间值拥有无限范围和精度一般求值,见 #pragma STDC FP_CONTRACT 。

浮点数上的某些运算受浮点环境的状态影响,并对其进行修改(最值得注意的是舍入方向)。

在实浮点类型和整数类型间定义了隐式转换。

浮点类型的其他细节、界限和性质见浮点类型的界限和 std::numeric_limits 。

取值范围

下表提供常用数值表示的界限的参考。

C++20 之前,C++ 标准曾允许任意的有符号整数表示,而 N 位有符号整数的最小保证范围为从 -2N-1
+1 到 +2N-1
-1 (例如有符号 8 位类型为 -127127 ),这对应于反码原码的界限。

然而,所有 C++ 编译器均使用补码表示,而从 C++20 起,这是标准所允许的唯一表示,所保证的范围为从 -2N-1
到 +2N-1
-1 (例如有符号 8 位类型为 -128127 )。

类型 位数 格式 取值范围
近似 精确
字符 8 有符号 -128127
无符号 0255
16 无符号 065535
32 无符号 01114111 (0x10ffff)
整数 16 有符号 ± 3.27 · 104 -3276832767
无符号 06.55 · 104 065535
32 有符号 ± 2.14 · 109 -2,147,483,6482,147,483,647
无符号 04.29 · 109 04,294,967,295
64 有符号 ± 9.22 · 1018 -9,223,372,036,854,775,8089,223,372,036,854,775,807
无符号 01.84 · 1019 018,446,744,073,709,551,615
浮点 32 IEEE-754
  • 最小非正规:
    ± 1.401,298,4 · 10-45
  • 最小正规:
    ± 1.175,494,3 · 10-38
  • 最大:
    ± 3.402,823,4 · 1038
  • 最小非正规:
    ±0x1p-149
  • 最小正规:
    ±0x1p-126
  • 最大:
    ±0x1.fffffep+127
64 IEEE-754
  • 最小非正规:
    ± 4.940,656,458,412 · 10-324
  • 最小正规:
    ± 2.225,073,858,507,201,4 · 10-308
  • 最大:
    ± 1.797,693,134,862,315,7 · 10308
  • 最小非正规:
    ±0x1p-1074
  • 最小正规:
    ±0x1p-1022
  • 最大:
    ±0x1.fffffffffffffp+1023

注意:这些类型可表示的值的实际界限(与保证的最小界限相对)可通过 <climits> 、 <cfloat> 及 std::numeric_limits 获知。

关键词

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

 

Supongo que te gusta

Origin blog.csdn.net/qq_40788199/article/details/133428291
Recomendado
Clasificación