在这个答案和附加的评论中,Pavel Minaev提出了以下论点,即在 C 中,唯一uint8_t
可以 typedef 的类型是char
and 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
is ,要么它是宽度是(6.2.6.1p4)的倍数unsigned char
的非unsigned char
、非位字段类型。CHAR_BIT
基于这个论点,我同意,如果uint8_t
存在,那么它unsigned char
都具有相同的表示形式:8 个值位和 0 个填充位。这似乎并没有强迫它们是同一类型(例如,6.2.5p14)。
是否允许将uint8_t
typedef 定义为具有相同表示的扩展无符号整数类型 (6.2.5p6) unsigned char
?当然它必须是 typedef'd (7.18.1.1p2),并且它不能是任何标准的无符号整数类型unsigned char
(或者char
如果它恰好是无符号的)。这种假设的扩展类型不是字符类型(6.2.5p15),因此不符合对不兼容类型(6.5p7)对象的别名访问资格,这让我觉得编译器编写者想要这样做事物。