平台为什么选择签名char?

时间:2016-05-10 15:42:30

标签: c++ c

我看到很多关于签名/未签名字符的答案,但不是这个问题,所以如果已经有答案,请随时关闭/复制。

我知道在C和C ++中,数据类型'char'可以是有符号或无符号的。我知道不同的平台选择不同,但x86,以及我个人使用的所有其他平台都选择“char”进行签名。

在我看来,选择unsigned char有一些小优点,例如你可以将值用作数组索引,以便对值进行分类,但可能有原因,无论是语言相关,或者在目标架构中使签名成为更好的选择。

这些原因是什么?

1 个答案:

答案 0 :(得分:13)

在C89中添加了signed关键字。在此之前,如果您使charunsigned char相同,则无法访问签名的char大小的类型。因此,大多数早期的C ABI定义了char要签名。 (尽管如此,有例外 - 如果没有任何例外情况,C89将强制 char签署。)

从那时起,我们在代码之间有一个连续的反馈循环,假设char已经签名(因为程序员从来没有见过ABI它不在哪里,所以为什么还要打字多加一个字? )和ABI将char定义为已签名,以确保与尽可能多的现有代码兼容。

greenfields 语言设计会使charint8_t分离出基本类型,但是现在C的重要性依赖于大量现有代码;你不可能永远看到这种变化。

(另请注意,在1989年,计算机和应用程序仅支持7位ASCII仍然很常见。因此,签名char对文本数据的不便之处则不那么明显。您提到的表只有128个条目。char被8位签名实际上更多对于使用7位文本并使用第8位作为每个的程序来说非常方便 - 字符标志。)