允许实现使用超过N
位作为intN_t
和uintN_t
类型的对象存储,前提是它们中存储的值是否符合要求的范围?
例如,考虑使用9位字节的CPU。为此CPU编写的实现可能具有类似typedef __uint8_as_9 uint8_t
的内容,假设__uint8_as_9
引用一个编译器关键字,表示一个9位无符号整数,表示一个8位无符号整数。当编译器生成用于将unsigned int
转换为此类型的代码时,它可以(隐式地)将该数字截断为9位,然后屏蔽掉最高位。这仍然被认为是uint8_t
的一致定义,因为编译器确保9位值在0
到UINT8_MAX
的范围内?
引用C标准§7.20.1.1/ 3,关于精确宽度整数类型(强调我的):
这些类型是可选的。但是,如果实现提供了整数类型 宽度为8,16,32或64位,无填充位,以及(对于已签名类型)具有 二进制补码表示,它应定义相应的typedef名称。
由于uint8_t
的底层存储实际上由9位组成,这个最重要的位是否被认为是填充位?即使它对使用此实现的任何(符合标准)程序完全透明吗?
答案 0 :(得分:4)
具有9位字节的系统的编译器(即CHAR_BIT==9
根本不会定义uint8_t
或int8_t
。如果确实如此,那么第9位将是填充位,这违反了标准的要求。
这些类型是可选的,不能由无法满足所有要求的实现提供。
此类实现仍会提供[u]int_least8_t
和[u]int_fast8_t
,程序可以检查宏UINT8_MAX
是否已定义,以确定是否可以使用uint8_t
。