在this answer和所附评论,Pavel Minaev提出以下论点,即在 C 中,uint8_t
的唯一类型可以 typedef 是 char
和 unsigned char
.我在看 this draft 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
类型定义为扩展无符号整数类型 (6.2.5p6),其表示形式与 unsigned char
相同? 当然它必须是 typedef'd (7.18.1.1p2),并且它不能是除 unsigned char
之外的任何标准无符号整数类型(或者 char
如果它恰好是未签名的)。这种假设的扩展类型不是字符类型 (6.2.5p15),因此不符合对不兼容类型 (6.5p7) 的对象的别名访问,这让我印象深刻,因为编译器作者想要这样做
最佳答案
如果 uint8_t
存在,则无填充要求意味着 CHAR_BIT
为 8。但是,没有根本原因我可以找到为什么 uint8_t
无法用扩展整数类型 定义。此外,不能保证表示是相同的;例如,这些位可以按相反的顺序解释。
虽然这对于 uint8_t
来说似乎很愚蠢而且毫无理由地不寻常,但对于 int8_t
来说可能很有意义。如果机器本身使用补码或符号/大小,则 signed char
不适合 int8_t
。但是,它可以使用模拟二进制补码的扩展有符号整数类型来提供 int8_t
。
关于uint8_t 可以是非字符类型吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12666146/