小编use*_*520的帖子

uint8_t可以是非字符类型吗?

在这个答案和附带的评论中,Pavel Minaev提出以下论点:在C中,uint8_t可以使用typedef 的唯一类型是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具有相同表示的扩展无符号整数类型(6.2.5p6)进行typedef unsigned char?当然它必须是typedef'd(7.18.1.1p2),并且它不能是除unsigned char(或者char它恰好是无符号)之外的任何标准无符号整数类型.这个假设的扩展类型不是字符类型(6.2.5p15),因此不符合对不兼容类型(6.5p7)的对象的别名访问,这让我觉得编译器编写者想要这样做的原因事情.

c language-lawyer

15
推荐指数
2
解决办法
1227
查看次数

标签 统计

c ×1

language-lawyer ×1