uint8_t可以是非字符类型吗?

时间:2012-09-30 23:53:46

标签: c language-lawyer

this answer和附加的评论中,Pavel Minaev提出以下参数:在C中,uint8_t可以被{type}定义的唯一类型是charunsigned char。我正在查看C标准的this draft

  • uint8_t的存在意味着存在相应类型int8_t(7.18.1p1)。
  • int8_t是8位宽,没有填充位(7.18.1.1p1)。
  • 对应的类型具有相同的宽度(6.2.5p6),因此uint8_t也是8位宽。
  • unsigned charCHAR_BIT位(5.2.4.2.1p2和6.2.6.1p3)。
  • CHAR_BIT至少为8(5.2.4.2.1p1)。
  • CHAR_BIT最多为8,因为uint8_tunsigned char,或者是非unsigned char非位字段类型,其宽度为CHAR_BIT(6.2.6.1p4)。

基于这个论点,我同意,如果uint8_t存在,那么它和unsigned char都有相同的表示:8个值位和0个填充位。这似乎并不强迫它们成为同一类型(例如,6.2.5p14)。

是否允许uint8_t使用与unsigned char相同的表示形式对扩展无符号整数类型(6.2.5p6)进行类型定义?当然它必须是typedef 'd(7.18.1.1p2),它不能是unsigned char以外的任何标准无符号整数类型(如果恰好是无符号,则为char)。这个假设的扩展类型不是字符类型(6.2.5p15),因此不符合对不兼容类型(6.5p7)的对象的别名访问,这让我觉得编译器编写者想要这样做的原因的事情。

4 个答案:

答案 0 :(得分:4)

如果uint8_t存在,则无填充要求意味着CHAR_BIT为8.但是,没有根本原因我可以找到为什么uint8_t无法使用定义扩展整数类型。此外,无法保证陈述相同;例如,这些位可以按相反的顺序解释。

虽然uint8_t对于int8_t来说这看起来很愚蠢而且非常不寻常,但它对signed char很有意义。如果计算机本机使用补码或符号/幅度,则int8_t不适用于int8_t。但是,它可以使用扩展的有符号整数类型来模拟二进制补码以提供{{1}}。

答案 1 :(得分:2)

在6.3.1.1(1)(C11标准的N1570草案)中,我们可以阅读

  

任何标准整数类型的等级应大于具有相同宽度的任何扩展整数类型的等级。

因此,标准明确允许存在与标准整数类型相同宽度的扩展整数类型。

标准中没有任何内容禁止

typedef implementation_defined_extended_8_bit-unsigned_integer_type uint8_t;

如果扩展整数类型与uint8_t的规范匹配(没有填充位,宽度为8位),就我所见。

所以是的,如果实现提供了这样一个扩展的整数类型,uint8_t 可以对它进行类型化。

答案 2 :(得分:0)

uint8_t可能存在且与unsigned char不同。

这一重要意义在于重载决议;它取决于平台:

uint8_t by = 0;
std::cout << by;

用途

  1. operator<<(ostream, char)
  2. operator<<(ostream, unsigned char)
  3. operator<<(ostream, int)

答案 3 :(得分:-1)

int8_t和uint8_t的区别仅在于REPRESENTATION而不是内容(位)。 int8_t使用低7位表示数据,第8位表示“符号”(正数或负数)。因此,int8_t的范围是从-128到+127(0被认为是正值)。

uint8_t也是8位宽,但其中包含的数据总是正数。因此uint8_t的范围是0到255.

考虑到这个事实,char是8位宽。 unsigned char也可以是8位宽但没有“符号”。类似地,短和无符号短路都是16位宽。

然而,

IF,“unsigned int”是8位宽,然后..因为C不是太类型纳粹,所以它是允许的。为什么编译器编写者会允许这样的事情呢?可读性!