Spec-Zone.ru › C++

Основные типы

(См. также тип для обзора системы типов и список утилит, связанных с типами, предоставляемых библиотекой C++)

Тип void

void — тип с пустым набором значений. Это неполный тип, который не может быть дополнен (соответственно, объекты типа void запрещены). Нет массивов void, а также ссылок на void. Однако разрешены указатели на void и функции, возвращающие тип void (процедуры в других языках).

std::nullptr_t (с C++11)

Определено в заголовке <cstddef>
typedef decltype(nullptr) nullptr_t;
(с C++11)

std::nullptr_t — это тип константы нулевого указателя nullptr. Это отдельный тип, который сам по себе не является типом указателя или указателя на член. Его значения — константы нулевого указателя (см. NULL), и они могут быть неявно преобразованы в любой тип указателя и указателя на член.

sizeof(std::nullptr_t) равно sizeof(void*).

Модели данных

Выбор каждой реализации относительно размеров основных типов в совокупности известен как модель данных. Широкое признание получили четыре модели данных:

32-разрядные системы:

  • LP32 или 2/4/4 (int — 16 бит, long и указатель — 32 бита)
    • Win16 API
  • ILP32 или 4/4/4 (int, long и указатель — 32 бита);
    • Win32 API
    • Системы Unix и Unix-подобные системы (Linux, macOS)

64-разрядные системы:

  • LLP64 или 4/4/8 (int и long — 32 бита, указатель — 64 бита)
    • Win32 API (также называемый API Windows) с целевой компиляцией 64-битный ARM (AArch64) или x86-64 (также x64)
  • LP64 или 4/8/8 (int — 32 бита, long и указатель — 64 бита)
    • Системы Unix и Unix-подобные системы (Linux, macOS)

Другие модели встречаются очень редко. Например, ILP64 (8/8/8: int, long и указатель — 64 бита) встречалась только в некоторых ранних 64-битных системах Unix (например, UNICOS на Cray).

Целочисленные типы

Стандартные целочисленные типы

int — базовый целочисленный тип. Ключевое слово int можно опустить, если используются какие-либо модификаторы, перечисленные ниже. Если нет модификаторов длины, гарантируется ширина как минимум 16 бит. Однако на 32/64-битных системах практически гарантируется ширина как минимум 32 бита (см. ниже).
Модификаторы

Модифицируют базовый целочисленный тип. Могут комбинироваться в любом порядке. В имени типа может быть только один модификатор из каждой группы.

  • Знаковый/беззнаковый:
signed — целевой тип будет иметь знаковое представление (это значение по умолчанию, если не указано другое)
unsigned — целевой тип будет иметь беззнаковое представление
  • Размер:
short — целевой тип будет оптимизирован для экономии памяти и будет иметь ширину как минимум 16 бит.
long — целевой тип будет иметь ширину как минимум 32 бита.
long long — целевой тип будет иметь ширину как минимум 64 бита. (с C++11)

Примечание: как и со всеми спецификаторами типов, допускается любой порядок: unsigned long long int и long int unsigned long обозначают один и тот же тип.

Свойства

В следующей таблице обобщены все доступные целочисленные типы и их свойства в различных распространенных моделях данных:

Спецификатор типа Эквивалентный тип Ширина в битах по модели данных
Стандарт C++ LP32 ILP32 LLP64 LP64
signed char
signed char как минимум
8
8 8 8 8
unsigned char
unsigned char
short
short int как минимум
16
16 16 16 16
short int
signed short
signed short int
unsigned short
unsigned short int
unsigned short int
int
int как минимум
16
16 32 32 32
signed
signed int
unsigned
unsigned int
unsigned int
long
long int как минимум
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)
как минимум
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

Примечание: арифметика целых чисел определяется по-разному для знаковых и беззнаковых целочисленных типов. См. арифметические операторы, в частности переполнения целых чисел.

std::size_t — это целочисленный тип без знака результата оператора sizeof, а также оператора sizeof... и оператора alignof.

Расширенные целочисленные типы (с C++11)

Расширенные целочисленные типы определяются реализацией. Обратите внимание, что типы целочисленных чисел фиксированной ширины обычно являются псевдонимами стандартных целочисленных типов.

Логический тип

bool — тип, способный хранить одно из двух значений: true или false. Значение sizeof(bool) определяется реализацией и может отличаться от 1.

Символьные типы

signed char — тип для представления знакового символа.
unsigned char — тип для представления беззнакового символа. Также используется для проверки представлений объектов представлений объектов (сырая память).
char — тип для представления символа, который может быть наиболее эффективно обработан на целевой системе (имеет такое же представление и выравнивание, как signed char или unsigned char, но всегда является отдельным типом). Многобайтовые строковые литералы используют этот тип для представления кодовых единиц. Для каждого значения типа unsigned char в диапазоне [​0​, 255], преобразование значения в char и затем обратно в unsigned char даёт исходное значение.(с C++11) Знакозначность типа char зависит от компилятора и целевой платформы: по умолчанию для ARM и PowerPC обычно используется беззнаковое представление, а для x86 и x64 — знаковое.
wchar_t — тип для представления широких символов (см. широкие строки). Он имеет тот же размер, знакозначность и выравнивание, что и один из целочисленных типов, но является отдельным типом. На практике он имеет 32 бита и хранит UTF-32 на Linux и многих других не-Windows системах, но 16 бит и хранит кодовые единицы UTF-16 на Windows. Стандарт раньше требовал, чтобы wchar_t был достаточно большим, чтобы представлять любой поддерживаемый код символа. Однако такое требование не может быть выполнено на Windows, и поэтому это считается ошибкой и удалено.
char16_t — тип для представления символов UTF-16, должен быть достаточно большим для представления любой кодовой единицы UTF-16 (16 бит). Он имеет тот же размер, знакозначность и выравнивание, что и std::uint_least16_t, но является отдельным типом. char32_t — тип для представления символов UTF-32, должен быть достаточно большим для представления любой кодовой единицы UTF-32 (32 бита). Он имеет тот же размер, знакозначность и выравнивание, что и std::uint_least32_t, но является отдельным типом. (с C++11)
char8_t — тип для представления символов UTF-8, должен быть достаточно большим для представления любой кодовой единицы UTF-8 (8 бит). Он имеет тот же размер, знакозначность и выравнивание, что и unsigned char (и, следовательно, тот же размер и выравнивание, что и char и signed char), но является отдельным типом. (с C++20)

Помимо минимального количества бит, Стандарт C++ гарантирует, что 1 == sizeof(char) ≤ sizeof(short) ≤ sizeof(int) ≤ sizeof(long) ≤ sizeof(long long).

Примечание: это позволяет крайний случай, в котором байты имеют размер 64 бита, все типы (включая char) имеют ширину 64 бита, и sizeof возвращает 1 для каждого типа.

Типы с плавающей запятой

Стандартные типы с плавающей запятой

Следующие три типа и их квалифицированные версии (с модификаторами const и volatile) вместе называются стандартными типами с плавающей запятой.

float — тип с плавающей запятой одинарной точности. Соответствует формату IEEE-754 binary32, если он поддерживается.
double — тип с плавающей запятой двойной точности. Соответствует формату IEEE-754 binary64, если он поддерживается.
long double — тип с плавающей запятой расширенной точности. Соответствует формату IEEE-754 binary128, если он поддерживается, в противном случае соответствует формату IEEE-754 binary64-extended, если он поддерживается, в противном случае соответствует некоторому формату расширенной плавающей запятой, который имеет большую точность, чем binary64, и не меньший диапазон, чем binary64, в противном случае соответствует формату IEEE-754 binary64.
  • Формат binary128 используется некоторыми реализациями HP-UX, SPARC, MIPS, ARM64 и z/OS.
  • Наиболее известный формат IEEE-754 binary64-extended — это формат расширенной точности x87 80 бит. Он используется во многих реализациях x86 и x86-64 (заметное исключение — MSVC, который реализует long double в том же формате, что и double, то есть binary64).

Типы с плавающей запятой расширенной точности (с C++23)

Типы с плавающей запятой расширенной точности определяются реализацией. Они могут включать типы с плавающей запятой фиксированной ширины.

Свойства

Типы с плавающей запятой могут поддерживать специальные значения:

  • бесконечность (положительная и отрицательная), см. INFINITY
  • отрицательный ноль, -0.0. Он сравнивается как равный положительному нулю, но имеет значение в некоторых арифметических операциях, например, 1.0 / 0.0 == INFINITY, но 1.0/-0.0 == -INFINITY), и для некоторых математических функций, например, sqrt(std::complex)
  • не число (NaN), которое не сравнивается как равное ничему (включая себя). Несколько битовых шаблонов представляют NaN, см. std::nan, NAN. Обратите внимание, что C++ не обращает особого внимания на сигнализирующие NaN, за исключением обнаружения их поддержки std::numeric_limits::has_signaling_NaN, и обрабатывает все NaN как несигнализирующие.

Вещественные числа с плавающей запятой могут использоваться с арифметическими операторами +, -, /, и *, а также с различными математическими функциями из <cmath>. Как встроенные операторы, так и функции библиотеки могут генерировать исключения с плавающей запятой и устанавливать errno, как описано в math errhandling.

Выражения с плавающей запятой могут иметь больший диапазон и точность, чем указано их типами, см. FLT_EVAL_METHOD. Выражения с плавающей запятой также могут быть скомпрессированными, то есть вычисляться так, как если бы все промежуточные значения имели бесконечный диапазон и точность, см. #pragma STDC FP_CONTRACT. Стандарт C++ не ограничивает точность операций с плавающей запятой.

Некоторые операции с числами с плавающей запятой зависят от и изменяют состояние среды с плавающей запятой (в частности, направление округления).

Неявные преобразования определены между вещественными типами с плавающей запятой и целочисленными типами.

См. Пределы типов с плавающей запятой и std::numeric_limits для получения дополнительной информации, пределов и свойств типов с плавающей запятой.

Диапазон значений

В следующей таблице представлен справочник по пределам распространённых числовых представлений.

До C++20 Стандарт C++ допускал любое знаковое целочисленное представление, и минимальный гарантированный диапазон N-битных знакомых целых чисел был от \(\scriptsize -(2^{N-1}-1)\)-(2N-1-1) до \(\scriptsize +2^{N-1}-1\)+2N-1-1 (например, −127 до 127 для знакового 8-битного типа), что соответствует пределам дополнительного кода или знакового и абсолютного значения.

Однако все компиляторы C++ используют дополнительный код, и начиная с C++20 он является единственным допустимым представлением по стандарту, с гарантированным диапазоном от \(\scriptsize -2^{N-1}\)-2N-1 до \(\scriptsize +2^{N-1}-1\)+2N-1-1 (например, −128 до 127 для знакового 8-битного типа).

8-битные представления дополнительного кода и знакового и абсолютного значения для char были запрещены с C++11 (через решение проблемы CWG 1759), потому что кодовая единица UTF-8 со значением 0x80, используемая в литерале UTF-8 строки, должна храниться в объекте типа char.

Диапазон для типа с плавающей запятой T определяется следующим образом:

  • Минимальный гарантированный диапазон — это наименьшее конечное число с плавающей запятой, представимое в T через наибольшее конечное число с плавающей запятой, представимое в T.
  • Если в T можно представить отрицательную бесконечность, диапазон T расширяется до всех отрицательных вещественных чисел.
  • Если в T можно представить положительную бесконечность, диапазон T расширяется до всех положительных вещественных чисел.

Поскольку отрицательная и положительная бесконечность представимы в форматах ISO/IEC/IEEE 60559, все вещественные числа находятся в диапазоне представимых значений типа с плавающей запятой, соответствующего ISO/IEC/IEEE 60559.

END_OF_DOCUMENT_MARKER ```
Тип Размер в битах Формат Диапазон значений
Приблизительный Точный
символ 8 знаковый −128 до 127
беззнаковый 0 до 255
16 UTF-16 0 до 65535
32 UTF-32 0 до 1114111 (0x10ffff)
целое 16 знаковый ± 3,27 · 104 −32768 до 32767
беззнаковый 0 до 6,55 · 104 0 до 65535
32 знаковый ± 2,14 · 109 −2 147 483 648 до 2 147 483 647
беззнаковый 0 до 4,29 · 109 0 до 4 294 967 295
64 знаковый ± 9,22 · 1018 −9 223 372 036 854 775 808 до 9 223 372 036 854 775 807
беззнаковый 0 до 1,84 · 1019 0 до 18 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
80[примечание 1] x86
  • мин. ненормализованное:
    ± 3,645 199 531 882 474 602 528
    · 10−4951
  • мин. нормализованное:
    ± 3,362 103 143 112 093 506 263
    · 10−4932
  • макс.:
    ± 1,189 731 495 357 231 765 021
    · 104932
  • мин. ненормализованное:
    ±0x1p−16445
  • мин. нормализованное:
    ±0x1p−16382
  • макс.:
    ±0x1.fffffffffffffffep+16383
128 IEEE-754
  • мин. ненормализованное:
    ± 6,475 175 119 438 025 110 924,
    438 958 227 646 552 5 · 10−4966
  • мин. нормализованное:
    ± 3,362 103 143 112 093 506 262,
    677 817 321 752 602 6 · 10−4932
  • макс.:
    ± 1,189 731 495 357 231 765 085,
    759 326 628 007 016 2 · 104932
  • мин. ненормализованное:
    ±0x1p−16494
  • мин. нормализованное:
    ±0x1p−16382
  • макс.:
    ±0x1.ffffffffffffffffffffffffffff
    p+16383
  1. Представление объекта обычно занимает 96/128 бит на 32/64-битных платформах соответственно.

Примечание: фактические (в отличие от гарантированных минимальных) ограничения на значения, представимые этими типами, доступны в C интерфейсе числовых ограничений и std::numeric_limits.

Примечания

Макрокоманда проверки наличия функции Значение Стандарт Функция
__cpp_unicode_characters 200704L (C++11) Новые типы символов (char16_t и char32_t)
__cpp_char8_t 201811L (C++20) char8_t
202207L (C++23) Исправление совместимости и переносимости char8_t (разрешение инициализации (unsigned) char массивов из UTF-8 строковых литералов)

Ключевые слова

void, bool, true, false, char, wchar_t, char8_t, (с C++20) char16_t, char32_t, (с C++11) int, short, long, signed, unsigned, float, double

Отчеты о дефектах

Следующие отчеты о дефектах, изменяющие поведение, были применены ретроактивно к ранее опубликованным стандартам C++.

DR Применено к Поведение, как опубликовано Правильное поведение
CWG 238 C++98 ограничения, накладываемые на реализацию с плавающей точкой, были не определены определены как
никаких ограничений
CWG 1759 C++11 char не гарантируется, что сможет представить код UTF-8 0x80 гарантируется
CWG 2723 C++98 диапазоны представимых значений для типов с плавающей точкой не были указаны указаны
P2460R2 C++98 wchar_t должно было иметь возможность представить различные коды для всех членов
наибольшего расширенного набора символов, указанного среди поддерживаемых локалей
не требуется

См. также

  • Обзор системы типов C++
  • Спецификаторы const-volatility (cv) и квалификаторы
  • Спецификаторы срока хранения
C документация для арифметических типов

© cppreference.com
Licensed under the Creative Commons Attribution-ShareAlike Unported License v3.0.
https://en.cppreference.com/w/cpp/language/types

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API