В языке программирования C, типы данных составляют семантику и характеристики хранение элементов данных. Они выражаются в синтаксисе языка в форме объявлений для ячеек памяти или переменных. Типы данных также определяют типы операций или методы обработки элементов данных.
Язык C предоставляет основные арифметические типы, такие как целые и вещественные числа типы, а также синтаксис для построения массивов и составных типов. Заголовки для стандартной библиотеки C, которая будет использоваться через директивы include, содержат определения поддерживаемых типов, которые имеют дополнительные свойства, такие как предоставление хранилища точного размера, независимо от языка. реализация на конкретных аппаратных платформах.
Язык C предоставляет четыре основных арифметических спецификатора типа char, int, float и double, а также модификаторы signed, unsigned, short и long. В следующей таблице перечислены допустимые комбинации при указании большого набора объявлений, зависящих от размера хранилища.
Тип | Пояснение | Минимальный размер (биты) | Описатель формата |
---|---|---|---|
char | Наименьшая адресуемая единица устройства, которая может содержать базовый набор символов. Это целочисленный тип. Фактический тип может быть подписанным или беззнаковым. Он содержит биты CHAR_BIT. | 8 | %c |
signed char | Имеет тот же размер, что и char, но гарантированно подписан. Может содержать как минимум диапазон [−127, +127]. | 8 | %c (или % hhi для числового вывода) |
unsigned char | того же размера, что и char, но гарантированно быть без подписи. Содержит как минимум диапазон [0, 255]. | 8 | %c (или % hhu для числового вывода) |
short . short int . signed short . signed short int | Короткий знаковый целочисленный тип. Может содержать как минимум диапазон [-32,767, +32,767]. | 16 | % hi или % hd |
unsigned short . unsigned short int | короткий целочисленный тип без знака. Содержит как минимум диапазон [0, 65 535]. | 16 | % hu |
int . signed . signed int | Базовый целочисленный тип со знаком. Может содержать как минимум диапазон [-32,767, +32,767]. | 16 | %i или %d |
unsigned . unsigned int | Базовый целочисленный тип без знака. Содержит как минимум диапазон [0, 65 535]. | 16 | %u |
long . long int . signed long . signed long int | длинный целочисленный тип со знаком. Может содержать как минимум диапазон [−2 147 483 647, +2 147 483 647]. | 32 | % li или % ld |
unsigned long . unsigned long int | длинный целочисленный тип без знака. Может содержать как минимум диапазон [0, 4,294,967,295]. | 32 | % lu |
long long . long long int . signed long long . signed long long int | длинный длинный целочисленный тип со знаком. Способен содержать по крайней мере диапазон [-9,223,372,036,854,775,807, +9,223,372,036,854,775,807]. Указан начиная с версии стандарта C99. | 64 | % lli или % lld |
unsigned long long . unsigned long long int | длинный длинный целочисленный тип без знака. Содержит как минимум диапазон [0, +18,446,744,073,709,551,615]. Определяется начиная с версии стандарта C99. | 64 | % llu |
float | Реальный тип с плавающей запятой, обычно называемый типом с плавающей запятой одинарной точности. Фактические свойства не указаны (за исключением минимальных ограничений); однако в большинстве систем это двоичный формат с плавающей запятой одинарной точности IEEE 754 (32 бита). Этот формат требуется дополнительным Приложением F «Арифметика с плавающей запятой МЭК 60559». | Преобразование из текста:
| |
double | Действительный тип с плавающей запятой, обычно называемый типом с плавающей запятой двойной точности. Фактические свойства не указаны (за исключением минимальных ограничений); однако в большинстве систем это двоичный формат с плавающей запятой двойной точности IEEE 754 (64 бита). Этот формат требуется дополнительным Приложением F «Арифметика с плавающей запятой МЭК 60559». |
| |
long double | Действительный тип с плавающей запятой, обычно отображаемый в формат чисел с плавающей запятой расширенной точности. Фактические свойства не указаны. Это может быть либо формат x86 с плавающей запятой с расширенной точностью (80 бит, но обычно 96 бит, либо 128 бит в памяти с байтами заполнения ), либо не-IEEE "double-double "(128 бит), IEEE 754, формат с плавающей запятой четверной точности (128 бит) или то же самое, что и double. Подробнее см. в статье о длинном двойном. | %Lf %LF . %Lg %LG . %Le %LE . %La % LA |
Фактический размер типов integer зависит от реализации. Стандарт требует только соотношения размеров между типами данных и минимального размера для каждого типа данных:
Требования соотношения заключаются в том, что long long
не меньше, чем long
, который не меньше, чем int
, который не меньше, чем short
. Поскольку размер char
всегда является минимальным поддерживаемым типом данных, никакие другие типы данных (кроме битовых полей ) не могут быть меньше.
Минимальный размер для char
- 8 бит, минимальный размер для short
и int
- 16 бит, для long
это 32 бита, а long long
должен содержать не менее 64 бита.
Тип int
должен быть целочисленным типом, с которым целевой процессор наиболее эффективно работает. Это обеспечивает большую гибкость: например, все типы могут быть 64-битными. Однако популярны несколько различных схем целочисленной ширины (моделей данных). Поскольку модель данных определяет, как взаимодействуют разные программы, в интерфейсе приложения данной операционной системы используется единая модель данных.
На практике char
обычно имеет размер 8 бит, а short
обычно имеет размер 16 бит (как и их беззнаковые аналоги). Это справедливо для самых разных платформ, таких как 1990-е годы SunOS 4 Unix, Microsoft MS-DOS, современный Linux и Microchip MCC18 для встроенных 8-битных PIC <69.>микроконтроллеры. POSIX требует, чтобы char
имел размер ровно 8 бит.
Различные правила в стандарте C делают unsigned char
основным типом, используемым для массивов, подходящих для хранения произвольных объектов небитовых полей: отсутствие битов заполнения и представления ловушек, определение представление объекта и возможность совмещения имен.
Фактический размер и поведение типов с плавающей запятой также зависят от реализации. Единственная гарантия состоит в том, что long double
не меньше double
, что не меньше float
. Обычно используются 32-битные и 64-битные IEEE 754 двоичные форматы с плавающей запятой.
Стандарт C99 включает новые реальные типы с плавающей запятой float_t
и double_t
, определенные в
. Они соответствуют типам, используемым для промежуточных результатов выражений с плавающей запятой, когда FLT_EVAL_METHOD
равно 0, 1 или 2. Эти типы могут быть шире, чем long double
.
C99 также добавлено сложные типы: float _Complex
, double _Complex
, long double _Complex
.
C99 добавлено логическое значение (true / false) введите _Bool
. Кроме того, заголовок
определяет bool
как удобный псевдоним для этого типа, а также предоставляет макросы для true
и false
. _Bool
функционирует аналогично обычному целочисленному типу, за одним исключением: любые присвоения _Bool
, отличные от 0 (false), сохраняются как 1 (true). Такое поведение существует, чтобы избежать целочисленных переполнений в неявных сужающих преобразованиях. Например, в следующем коде:
unsigned char b = 256; if (b) {/ * сделать что-то * /}
Переменная b
принимает значение false, если unsigned char
имеет размер 8 бит. Это связано с тем, что значение 256 не соответствует типу данных, в результате чего используются его младшие 8 бит, что приводит к нулевому значению. Однако изменение типа приводит к тому, что предыдущий код работает нормально:
_Bool b = 256; if (b) {/ * что-то делать * /}
Тип _Bool также гарантирует, что истинные значения всегда равны друг другу:
_Bool a = 1, b = 2; if (a == b) {/ * что-то сделать * /}
Спецификация языка C включает typedef s size_t
и ptrdiff_t
для представления величин, связанных с памятью. Их размер определяется в соответствии с арифметическими возможностями целевого процессора, а не возможностями памяти, такими как доступное адресное пространство. Оба этих типа определены в заголовке
(cstddef
в C ++).
size_t
- это целочисленный тип без знака, используемый для представления размера любого объекта (включая массивы) в конкретной реализации. Оператор sizeof возвращает значение типа size_t
. Максимальный размер size_t
предоставляется через SIZE_MAX
, макроконстанту, которая определена в заголовке
(cstdint
заголовок в C ++). size_t
гарантированно будет иметь ширину не менее 16 бит. Кроме того, POSIX включает ssize_t
, который представляет собой целочисленный тип со знаком той же ширины, что и size_t
.
ptrdiff_t
- целочисленный тип со знаком, используемый для представления разницы между указателями. Гарантируется, что он действителен только для указателей одного типа; вычитание указателей, состоящих из разных типов, определяется реализацией.
Информация о фактических свойствах, таких как размер, основных арифметических типов, предоставляется через макроконстанты в двух заголовках:
заголовок ( climits
header в C ++) определяет макросы для целочисленных типов, а заголовок
(cfloat
header в C ++) определяет макросы для типов с плавающей запятой. Фактические значения зависят от реализации.
CHAR_BIT
- размер типа char в битах (не менее 8 бит)SCHAR_MIN
, SHRT_MIN
, INT_MIN
, LONG_MIN
, LLONG_MIN
(C99) - минимально возможное значение целочисленных типов со знаком: signed char, signed short, signed int, signed long, long long со знакомSCHAR_MAX
, SHRT_MAX
, INT_MAX
, LONG_MAX
, LLONG_MAX
(C99) - максимально возможное значение целочисленных типов со знаком: signed char, signed short, signed int, signed long, signed long longUCHAR_MAX
, USHRT_MAX
, UINT_MAX
, ULONG_MAX
, ULLONG_MAX
(C99) - максимально возможное значение целочисленных типов без знака: unsigned char, unsigned short, unsigned int, unsigned long, unsigned long longCHAR_MIN
- минимально возможное значение charCHAR_MAX
- максимально возможное значение charMB_LEN_MAX
- максимальное количество байтов в многобайтовом символеFLT_MIN
, DBL_MIN
, LDBL_MIN
- минимальное нормализованное положительное значение float, double, long double соответственноFLT_TRUE_MIN
, DBL_TRUE_MIN
, LDBL_TRUE_MIN
(C11) - минимальное положительное значение float, double, long double соответственноFLT_MAX
, DBL_MAX
, LDBL_MAX
- максимальное конечное значение of float, double, long double, соответственноFLT_ROUNDS
- режим округления для операций с плавающей запятойFLT_EVAL_METHOD
(C99) - метод вычисления выражений с участием различных типов с плавающей запятойFLT_RADIX
- основание экспоненты в типах с плавающей запятойFLT_DIG
, DBL_DIG
, LDBL_DIG
- количество десятичных цифр, которые могут быть представлены без потери точности с помощью числа с плавающей запятой, double, long double, соответственноFLT_EPSILON
, DBL_EPSILON
, LDBL_EPSILON
- разница между 1.0 и следующим представимым значением float, double, long double, соответственноFLT_MANT_DIG
, DBL_MANT_DIG
, LDBL_MANT_DIG
- количество FLT_RADIX
цифр в значении с плавающей запятой для типов float, double, long double, соответственноFLT_MIN_EXP
, DBL_MIN_EXP
, LDBL_MIN_EXP
- минимальное отрицательное целое число, такое, что FLT_RADIX
в степени, на единицу меньше этого числа, является нормализованным числом с плавающей запятой, двойным, длинным двойным соответственноFLT_MIN_10_EXP
, DBL_MIN_10_EXP
, LDBL_MIN_10_EXP
- минимальное отрицательное целое число, такое, что 10 в этой степени является нормализованным числом с плавающей запятой, двойным, длинным двойным соответственноFLT_MAX_EXP
, DBL_MAX_EXP
, LDBL_MAX_EXP
- максимальное положительное целое число, такое, что FLT_RADIX
, возведенное в степень на единицу меньше этого числа, является нормализованным числом с плавающей запятой, двойным, длинным двойным соответственноFLT_MAX_10_EXP
, DBL_MAX_10_EXP
, LDBL_MAX_10_EXP
- максимальное положительное целое число, такое, что 10 в этой степени является нормализованным числом с плавающей запятой, двойным, длинным двойным, соответственноDECI MAL_DIG
(C99) - минимальное количество десятичных цифр, такое, что любое число самого широкого поддерживаемого типа с плавающей запятой может быть представлено в десятичном виде с точностью DECIMAL_DIG
цифр и считано в исходном формате с плавающей запятой. тип точки без изменения его значения. DECIMAL_DIG
не менее 10.Стандарт C99 включает определения нескольких новых целочисленных типов для повышения переносимости программ. Уже доступных базовых целочисленных типов было сочтено недостаточным, поскольку их фактические размеры определяются реализацией и могут различаться в разных системах. Новые типы особенно полезны во встроенных средах, где оборудование обычно поддерживает только несколько типов и эта поддержка различается в зависимости от среды. Все новые типы определены в заголовке
(заголовок cinttypes
в C ++), а также доступны в заголовке
(заголовок cstdint
в C ++). Типы можно сгруппировать в следующие категории:
В следующей таблице перечислены типы и интерфейс для получения реализации. подробности (n означает количество битов):
Категория типа | Типы со знаком | Типы без знака | |||||||
---|---|---|---|---|---|---|---|---|---|
Тип | Минимальное значение | Максимальное значение | Тип | Минимальное значение | Максимальное значение | ||||
Точная ширина | intn_t | INTn_MIN | INTn_MAX | uintn_t | 0 | UINTn_MAX | |||
Наименьшая ширина | int_leastn_t | INT_LEASTn_MIN | INT_LEASTn_MAX | uint_leastn_t | 0 | UINT_LEASTn_MAX | |||
Fastest | int_fastn_t | INT_FAST_23n_MIN_MIN_FAST5 | INT_FAST_23n_MIN 210>Указатель | ||||||
Максимальная ширина | intmax_t | INTMAX_MIN | INTMAX_MAX | UINT_MAX | UINT185>Спецификаторы форматов Printf и scanf |