如果存储在其中的值符合要求的范围,是否允许实现使用超过N
位作为对象存储intN_t
和类型?uintN_t
例如,考虑一个使用 9 位字节的 CPU。为这个 CPU 编写的实现可能有类似的东西typedef __uint8_as_9 uint8_t
,假设__uint8_as_9
引用了一个编译器关键字,表示一个 9 位无符号整数,它表示一个 8 位无符号整数。当编译器生成将 an 转换unsigned int
为这种类型的代码时,它可能(隐式)将数字截断为 9 位,然后屏蔽最高位。这仍然被认为是 的符合定义uint8_t
,因为编译器确保 9 位值在 到 的范围0
内UINT8_MAX
?
引用 C 标准§7.20.1.1/3,关于精确宽度整数类型(强调我的):
这些类型是可选的。但是,如果实现提供了宽度为 8、16、32 或 64 位的整数类型,没有填充位,并且(对于有符号类型)具有二进制补码表示,则它应定义相应的 typedef 名称。
由于底层存储uint8_t
实际上由 9 位组成,这个最重要的位是否被视为填充位?即使它对使用此实现的任何(符合)程序完全透明?