C uint8\u不能是非字符类型吗?
在和随附的注释中,提出了以下论点,即在C中,C uint8\u不能是非字符类型吗?,c,language-lawyer,C,Language Lawyer,在和随附的注释中,提出了以下论点,即在C中,uint8\u t可以被类型定义的唯一类型是char和unsigned char。我看的是C标准的一部分 存在uint8\u t意味着存在相应类型的int8\u t(7.18.1p1) int8\u t宽8位,没有填充位(7.18.1.1p1) 相应的类型具有相同的宽度(6.2.5p6),因此uint8\u t也具有8位宽 无符号字符为字符位位宽(5.2.4.2.1p2和6.2.6.1p3) 字符位至少为8(5.2.4.2.1p1) CHAR\u B
uint8\u t
可以被类型定义的唯一类型是char
和unsigned char
。我看的是C标准的一部分
- 存在
意味着存在相应类型的uint8\u t
(7.18.1p1)int8\u t
宽8位,没有填充位(7.18.1.1p1)int8\u t
- 相应的类型具有相同的宽度(6.2.5p6),因此
也具有8位宽uint8\u t
为无符号字符
位宽(5.2.4.2.1p2和6.2.6.1p3)字符位
至少为8(5.2.4.2.1p1)字符位
最多为8,因为CHAR\u BIT
是uint8\u t
,或者它是一个非unsigned CHAR
,非位字段类型,其宽度是unsigned CHAR
的倍数(6.2.6.1p4)CHAR\u BIT
uint8\t
存在,那么它和无符号字符
都有相同的表示:8个值位和0个填充位。这似乎并不强迫它们是相同的类型(例如6.2.5p14)
是否允许将
uint8\u t
类型定义为扩展无符号整数类型(6.2.5p6),其表示形式与无符号字符
相同(或char
如果它恰好是无符号的)。此假设扩展类型将不是字符类型(6.2.5p15),因此不符合对不兼容类型(6.5p7)的对象进行别名访问的条件,这让我感到震惊,因为编译器编写者希望这样做。int8\u t和uint8\u t仅在表示上不同,而在内容(位)上不同。int8\u t使用较低的7位表示数据,第8位表示“符号”(正或负)。因此,int8\u t的范围是从-128到+127(0被认为是正值)
uint8_t也是8位宽,但其中包含的数据始终为正。因此uint8_t的范围为0到255
考虑到这一事实,char是8位宽的。无符号char也可以是8位宽,但没有“符号”。同样,short和unsigned short都是16位宽的
但是,如果“
无符号整数
”既然C不是太类型,它是允许的。为什么编译器编写器会允许这样的事情?可读性!如果uint8\t
存在,无填充要求意味着CHAR\u BIT
是8。然而,我找不到根本的原因,为什么uint8\t
不能用扩展名定义ded整数类型。此外,不能保证表示是相同的;例如,位可以按相反的顺序解释
虽然这对于uint8\u t
来说似乎愚蠢且毫无意义的不寻常,但对于int8\u t
来说可能有很大的意义。如果机器本机使用一个补码或符号/大小,那么signed char
不适合int8\u t
。但是,它可以使用模拟两个补码的扩展有符号整数类型o在6.3.1.1(1)(C11标准N1570草案)中提供int8\u t
,我们可以阅读
任何标准整数类型的秩应大于具有相同宽度的任何扩展整数类型的秩
因此,该标准明确允许存在与标准整数类型宽度相同的扩展整数类型
标准中没有禁止使用
typedef implementation_defined_extended_8_bit-unsigned_integer_type uint8_t;
如果扩展整数类型与uint8\u t
的规范匹配(没有填充位,宽度为8位),就我所知
因此,是的,如果实现提供了这样的扩展整数类型,
uint8\u t
可能被定义为该类型。uint8\u t
可能存在,并且是与无符号字符
不同的类型
这一点的一个重要含义是过载解决;是否:
uint8_t by = 0;
std::cout << by;
uint8\u t by=0;
std::无法回答您的明确问题,但有可能char
是一种无符号类型,那么uint8\u t
可以在某一时刻(几年前)被类型定义为char
,而不是unsigned char
GCC项目中曾认真讨论过添加一个扩展整数类型,该类型的属性与您描述的完全相同——8位宽,不是字符类型,也不是基于类型的别名分析中的特例——但据我所知,它从未出现过,也没有暗示它是uint8\u t
(可能只是因为当时没人想到)。请注意,uint8\u t
根本不需要存在。它只是有条件地定义的。按理说,你现在是工作地点的傻瓜,必须找到所有代码,在uint8\u t
应该使用的地方使用unsigned char
,因此违反了任何此类实现的严格别名。在com作为补偿,你会非常得意地说“我告诉过你,我们不应该只在假设CHAR\u BIT==8
的情况下编写代码,如果你没有假设你一开始就不会对一个字节使用uint8\u t
,你就不会犯这个错误。”@SteveJessop:+1关于由于不是字符类型而导致的别名冲突,我没有注意到这一点。考虑到这一点,使用uint8\t
可以在此类实现中提供更好的性能(因为编译器可以假设它从不使用别名)。无符号int的宽度不小于16。根据规范,是的。但我们是假设看到的,不是吗?是的,我说“假设”,因为我不知道存在