uint8_t 可以是非字符类型吗?

标签 c language-lawyer

this answer和所附评论,Pavel Minaev提出以下论点,即在 C 中,uint8_t 的唯一类型可以 typedef 是 charunsigned 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 charCHAR_BIT位宽(5.2.4.2.1p2 和 6.2.6.1p3)。
  • CHAR_BIT至少为 8 (5.2.4.2.1p1)。
  • CHAR_BIT最多为 8,因为 uint8_tunsigned 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/

相关文章:

c - 字每2位为符号

c - 为什么下面的代码输出相同的地址?

c - C 中的胖指针

c - int main() { }(没有 "void")在 ISO C 中有效且可移植吗?

c++ - 为什么 C++ 标准以它的方式处理文件查找?

C 编程结构

c - driverlib ADC 触发器未被调用

c - 我如何使用 Opencv SparseMatrix

c++ - 依赖非类型参数包 : what does the standard say?

c++ - 为什么 C/C++ 中允许单独使用分号?