В этом ответе и прилагаемых комментариях Павел Минаев делает следующий аргумент, что в C, единственными типами, для которых uint8_t может быть typedef'd, являются char и unsigned char. Я смотрю этот проект стандарта C.
- Наличие
uint8_tподразумевает наличие соответствующего типаint8_t(7.18.1p1). -
int8_tимеет ширину 8 бит и не имеет битов заполнения (7.18.1.1p1). - Соответствующие типы имеют одинаковую ширину (6.2.5p6), поэтому
uint8_tтакже имеет ширину 8 бит. -
unsigned charимеет ширинуCHAR_BIT(5.2.4.2.1p2 и 6.2.6.1p3). -
CHAR_BITне менее 8 (5.2.4.2.1p1). -
CHAR_BITне более 8, потому что либоuint8_tестьunsigned char, либо это неunsigned char, тип небитового поля, ширина которого кратноCHAR_BIT(6.2.6.1p4).
Основываясь на этом аргументе, я согласен с тем, что если uint8_t существует, то и он, и unsigned char имеют одинаковые представления: 8 битов значения и 0 бит заполнения. Это, похоже, не заставляет их быть одного типа (например, 6.2.5p14).
Допустимо ли, что uint8_t является typedef'd для расширенного целочисленного типа без знака (6.2.5p6) с тем же представлением, что и unsigned char? Конечно, это должно быть typedef'd (7.18.1.1p2), и он не может быть любым стандартным беззнаковым целочисленным типом, отличным от unsigned char (или char, если он окажется без знака). Этот гипотетический расширенный тип не был бы символьным типом (6.2.5p15) и, следовательно, не мог бы претендовать на доступ к объекту несовместимого типа (6.5p7), который нападает на меня как на причину, по которой автор компилятора захочет сделать такую вещь.