Нет, стандарт C определяет минимальные размеры для целочисленных типов, но не дает никаких гарантий на максимальные размеры.
Реализация должна предоставлять intN_t
типы, если доступны типы такого размера. Я только упоминаю, что, поскольку у вас был кроссплатформенный тег - реализация, у которой нет типа правильной ширины в битах, не должна предоставлять эти типы.
Как правило, вы можете выбрать (с настройкой, например, с помощью cc -D_INT16_IS_INT
и #ifdef
s) правильный тип для использования для определенного размера бит. Вы можете разработать необходимые определения для каждой платформы, которую вы хотите поддерживать с помощью кода C, используя CHAR_BIT
и sizeof()
.
Соответствующий раздел черновика c1x (n1362):
7.18.1.1 Целочисленные типы точной ширины
Имя typedef intN_t
обозначает целочисленный тип со знаком со шириной N
, без битов заполнения и представление дополнения до двух. Таким образом, int8_t
обозначает целочисленный тип со знаком шириной ровно 8 бит.
Имя typedef uintN_t
обозначает целочисленный тип без знака с шириной N
. Таким образом, uint24_t
обозначает целочисленный тип без знака с шириной ровно 24 бита.
Эти типы не являются обязательными. Однако если реализация предоставляет целочисленные типы с шириной 8, 16, 32 или 64 бита, без битов заполнения и (для типов со знаком), которые имеют представление дополнения до двух, она должна определять соответствующие имена typedef.
Относительно выбора типов должно хватить что-то вроде этого:
#ifdef INT32_IS_SHORT
typedef short INT32
#endif
#ifdef INT32_IS_INT
typedef int INT32
#endif
#ifdef INT32_IS_LONG
typedef long INT32
#endif