Введение
Типы данных, поддерживаемые языком программирования C. В языке программирования C типы данных определяют семантику и характеристики хранения элементов данных. Они выражаются в синтаксисе языка в виде объявлений для областей памяти или переменных. Типы данных также определяют типы операций или способы обработки элементов данных. Язык C предоставляет базовые арифметические типы, такие как целочисленные и типы вещественных чисел, а также синтаксис для построения массивов и составных типов. Заголовочные файлы стандартной библиотеки C, подключаемые с помощью директив `#include`, содержат определения поддерживаемых типов, обладающих дополнительными свойствами, например, обеспечивающих хранение данных фиксированного размера, независимо от реализации языка на конкретных аппаратных платформах.
In the C programming language, data types constitute the semantics and characteristics of storage of data elements. They are expressed in the language syntax in form of declarations for memory locations or variables. Data types also determine the types of operations or methods of processing of data elements. The C language provides basic arithmetic types, such as integer and real number types, and syntax to build array and compound types. Headers for the C standard library, to be used via include directives, contain definitions of support types, that have additional properties, such as providing storage with an exact size, independent of the language implementation on specific hardware platforms.
Бито-точные типы целых чисел
С C23 язык позволяет программисту определять целые числа с шириной в произвольное количество бит. Эти типы задаются как , где N — целочисленное константное выражение, обозначающее количество бит, включая знаковый бит для знаковых типов, представленных в дополнительном коде. Максимальное значение N определяется константой BITINT MAXWIDTH и составляет не менее ULLONG WIDTH. Следовательно, тип (или ) принимает значения от -2 до 1, а тип — от 0 до 3. Также существует тип , который может принимать только значения 0 или 1 и не имеет эквивалентного знакового типа.
Размер и типы разности указателя
Спецификация языка C включает типы `size_t` и `ptrdiff_t` для представления величин, связанных с памятью. Их размер определяется в соответствии с арифметическими возможностями целевого процессора, а не с характеристиками памяти, такими как доступное адресное пространство. Оба этих типа определены в заголовочном файле `<stddef.h>` (в C++ – `cstddef`). `size_t` – это беззнаковый целочисленный тип, используемый для представления размера любого объекта (включая массивы) в конкретной реализации. Оператор `sizeof` возвращает значение типа `size_t`. Максимальный размер `size_t` задается макроконстантой `SIZE_MAX`, определенной в заголовочном файле `<stdint.h>` (в C++ – `cstdint`). Гарантируется, что `size_t` имеет ширину не менее 16 бит. Кроме того, POSIX определяет тип `ssize_t`, который является знаковым целочисленным типом той же ширины, что и `size_t`.
`ptrdiff_t` – это знаковый целочисленный тип, используемый для представления разности между указателями. Он гарантированно корректен только для указателей одного и того же типа; вычитание указателей разных типов определяется реализацией.
Интерфейс с свойствами основных типов
Информация о фактических свойствах, таких как размер, основных арифметических типов предоставляется посредством макроконстант в двух заголовочных файлах: <limits.h> (climits в C++) определяет макросы для целочисленных типов, а <float.h> (cfloat в C++) – макросы для типов с плавающей точкой. Конкретные значения зависят от реализации.
Типы целых чисел с фиксированной шириной
Стандарт C99 включает определения нескольких новых целочисленных типов для повышения переносимости программ. Однако более распространенное название atomic может быть использовано, если включен заголовочный файл <stdatomic.h>. Из них const является наиболее известным и широко используемым, он встречается в стандартной библиотеке и при любом значительном использовании языка C, который должен соответствовать принципам const-корректности. Другие спецификаторы используются в программировании низкого уровня, и хотя они широко распространены в этой области, типичные программисты используют их редко.