精确宽度整数类型的对象存储

时间:2014-08-01 21:28:31

标签: c standards-compliance stdint

允许实现使用超过N位作为intN_tuintN_t类型的对象存储,前提是它们中存储的值是否符合要求的范围?

例如,考虑使用9位字节的CPU。为此CPU编写的实现可能具有类似typedef __uint8_as_9 uint8_t的内容,假设__uint8_as_9引用一个编译器关键字,表示一个9位无符号整数,表示一个8位无符号整数。当编译器生成用于将unsigned int转换为此类型的代码时,它可以(隐式地)将该数字截断为9位,然后屏蔽掉最高位。这仍然被认为是uint8_t的一致定义,因为编译器确保9位值在0UINT8_MAX的范围内?

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

  

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

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

1 个答案:

答案 0 :(得分:4)

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

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

此类实现仍会提供[u]int_least8_t[u]int_fast8_t,程序可以检查宏UINT8_MAX是否已定义,以确定是否可以使用uint8_t