Я использую unsigned int
. (хотя я предпочитаю сокращение unsigned
)
В C99 unsigned int
гарантированно сможет индексировать любой переносимый массив. Гарантируется, что поддерживаются только массивы размером 65'535 байт или меньше, а максимальное значение unsigned int
составляет не менее 65'535.
Из публичного проекта WG14 N1256 стандарта C99:
5.2.4.1 Пределы перевода
Реализация должна иметь возможность переводить и выполнять по крайней мере одну программу, которая содержит по крайней мере один экземпляр каждого из следующих ограничений: (Реализации должны избегать наложения фиксированных ограничений на перевод, когда это возможно.)
(...)
- 65535 байт в объекте (только в размещенной среде)
(...)
5.2.4.2 Числовые пределы
Требуется реализация для документирования всех ограничений, указанных в этом подпункте, которые указаны в заголовках <limits.h>
и <float.h>
. Дополнительные ограничения указаны в <stdint.h>
.
5.2.4.2.1 Размеры целочисленных типов <limits.h>
Значения, приведенные ниже, должны быть заменены константными выражениями, подходящими для использования в #if
директивах предварительной обработки. Кроме того, за исключением CHAR_BIT
и MB_LEN_MAX
, следующее должно быть заменено выражениями того же типа, что и выражение, являющееся объектом соответствующего типа, преобразованным в соответствии с целочисленными повышениями. Их значения, определенные реализацией, должны быть равны или больше по величине (абсолютное
alue) к показанным с тем же знаком.
(...)
- максимальное значение для объекта типа
unsigned int
UINT_MAX
65535 // 2 ^ 16 - 1
В C89 максимальный размер переносимого массива на самом деле составляет всего 32'767 байт, поэтому подойдет даже int
со знаком, максимальное значение которого составляет не менее 32'767 (Приложение A.4).
Начиная с §2.2.4 чертежа C89:
2.2.4.1 Пределы перевода
Реализация должна иметь возможность переводить и выполнять по крайней мере одну программу, которая содержит по крайней мере один экземпляр каждого из следующих ограничений: (Реализации должны избегать наложения фиксированных ограничений на перевод, когда это возможно.)
(...)
- 32767 байт в объекте (только в размещенной среде)
(...)
2.2.4.2 Числовые пределы
Соответствующая реализация должна документировать все ограничения, указанные в этом разделе, которые должны быть указаны в заголовках <limits.h>
и <float.h>
.
"Размеры целых типов <limits.h>
"
Значения, приведенные ниже, должны быть заменены константными выражениями, подходящими для использования в директивах предварительной обработки #if. Их значения, определенные реализацией, должны быть равны или больше по величине (абсолютное значение) показанным с тем же знаком.
(...)
- максимальное значение для объекта типа int
INT_MAX
+ 32767