3

如果存储在其中的值符合要求的范围,是否允许实现使用超过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 位值在 到 的范围0UINT8_MAX

引用 C 标准§7.20.1.1/3,关于精确宽度整数类型(强调我的):

这些类型是可选的。但是,如果实现提供了宽度为 8、16、32 或 64 位的整数类型,没有填充位,并且(对于有符号类型)具有二进制补码表示,则它应定义相应的 typedef 名称。

由于底层存储uint8_t实际上由 9 位组成,这个最重要的位是否被视为填充位?即使它对使用此实现的任何(符合)程序完全透明?

4

1 回答 1

4

具有 9 位字节的系统的编译器(即,CHAR_BIT==9根本不会定义uint8_tor int8_t。如果定义了,则第 9 位将是填充位,这将违反标准的要求。

这些类型是可选的,不能由不能满足所有要求的实现提供。

这样的实现仍然会提供[u]int_least8_tand [u]int_fast8_t,并且程序可以检查是否UINT8_MAX定义了宏来确定它是否可以使用uint8_t

于 2014-08-01T21:40:58.663 回答