在 C++11 标准中,为什么要依赖 char 类型实现?

In the C++11 standard, why leave the char type implementation dependent?

本文关键字:char 依赖 类型 实现 为什么 C++11 标准      更新时间:2023-10-16

Background

几个C++源材料和堆栈溢出问题讨论了char的实现依赖性。 也就是说,C++中的char可以定义为unsigned charsigned char,但根据 ARM Linux FAQ,此实现完全取决于编译器:

上面的代码实际上是有问题的,因为它假设类型"char"等效于"有符号字符"。C 标准确实说"char"可以是"有符号 char"或"无符号 char",这取决于编译器实现或遵循的平台。

这为歧义问题和不良做法敞开了大门,包括在用作 8 位数字时误认为字符的标志。C的理由提供了一些理由来解释为什么会这样,但没有解决留下歧义可能性的问题:

指定了三种类型的字符:有符号、纯字符和无符号字符。纯字符可以表示为已签名或无符号,具体取决于实现,就像在以前的实践中一样。引入有符号字符类型是为了在那些将纯字符实现为无符号的系统上提供单字节有符号整数类型。出于对称性的原因,允许将关键字 signed 作为其他整型类型类型名称的一部分。

关闭大门似乎也是有利的,即使存在歧义的可能性,也只留下unsigned charsigned char的类型作为 8 位单元的两种数据类型。这促使我问了这个问题...

问题

鉴于可能存在歧义,为什么要让char数据类型实现依赖于?

一些处理器更喜欢有符号的字符,而另一些则更喜欢无符号的字符。例如,POWER 可以从扩展名为零的内存中加载 8 位值,但不能加载符号扩展名。但是 SuperH-3 可以从内存中加载一个带有符号扩展名但不能零扩展名的 8 位值。C++派生自 C,C 保留了语言实现定义的许多细节,以便可以定制每个实现以最有效地针对其目标环境。