В этом ответе и прилагаемых комментариях Павел Минаев делает следующий аргумент, что в 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), который нападает на меня как на причину, по которой автор компилятора захочет сделать такую вещь.