Мы продолжаем тему гарантий стандартов в отношении
представления значений в рамках стандартных реализаций языков Си
и Си++. Сегодня речь пойдет о нововведении [C99] ―
целочисленных типах специфицированной ширины.
Точность и ширина целочисленных типов
Точностью (precision) целочисленного типа называется
количество значащих битов в представлениях значений этого типа,
исключая знаковый и padding-биты. Ширина (width)
целочисленного типа - это то же, но уже включая знаковый бит,
если он есть ([1]).
Значения типов intN_t,
uintN_t, int_leastN_t, uint_leastN_t, int_fastN_t, uint_fastN_t,
intptr_t, uintptr_t, intmax_t и uintmax_t
[C99] ввел набор целочисленных типов специфицированной
ширины (specified-width integer types), собранных в
нескольких категориях. Имена этих типов ― это
typedef-имена, определяемые в
стандартном заголовке .
Знаковые и беззнаковые целочисленные типы точной
ширины(exact-width integer types) имеют имена вида intN_t и
uintN_t соответственно, где N ―
действительная ширина этих типов, записанная как положительное
целое число без лидирующих нулей (например,
int32_t). Значения таких типов всегда
представляются в форме дополнения до двух и не имеют
padding-битов.
Любая реализация, имеющая целочисленные типы шириной 8, 16,
32 или 64 бита должна определять соответствующие имена типов
точной ширины.
Знаковые и беззнаковые целочисленные типы наименьшей ширины
(minimum-width integer types) имеют имена вида
int_leastN_t и
uint_leastN
_t соответственно, где N ―
ширина, не меньшая действительной ширины этих типов, записанная
как положительное целое число без лидирующих нулей (например,
int_least24_t). Гарантируется, что в
рамках одной реализации для каждого из этих типов нет никакого
другого целочисленного типа с еще меньшей шириной (не меньшей
N).
Следующие восемь типов должны быть определены. Определения
других типов этой категории не обязательны.
Знаковые и беззнаковые наиболее быстрые целочисленные типы
минимальной ширины (fastest minimum-width integer types) имеют
имена вида int_fastN_t и uint_fastN_t соответственно, где N ―
ширина, не меньшая действительной ширины этих типов, записанная
как положительное целое число без лидирующих нулей (например,
int_fast16_t). В отличие от типов int_leastN_t и uint_leastN_t,
реализация выбирает для этих имен наиболее эффективные (быстрые)
в общем случае типы с шириной, не меньшей N.
Следующие восемь наиболее быстрых целочисленных типов
минимальной ширины должны быть определены. Определения других
типов этой категории не обязательны.
Знаковый и беззнаковый целочисленные типы intptr_t и
uintptr_t ― заведомо достаточные
для хранения указателей на объекты (integer types capable of
holding object pointers). Так, если указатель на void привести к
любому из этих типов, а затем это целочисленное значение
привести обратно к указателю на void,
получившееся значение указателя будет равно исходному.
Стандарт не требует определять эти два типа.
Целочисленные типы intmax_t и uintmax_t имеют максимальную
ширину в рамках той реализации, в которой они определены. Это
означает, что любые значения любых целочисленных типов могут
представлены как значения одного из этих типов.
Ниже приведены предельные действительные и минимальные
гарантированные значения целочисленных типов специфицированной
ширины.