c++ - 为什么平台选择 signed char?

标签 c++ c

<分区>

我看到很多关于 signed/unsigned char 的答案,但不是这个确切的问题,所以如果已经有答案,请随时关闭/复制。

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

在我看来,选择 unsigned char 有一些小优势,例如,如果您愿意,可以将值用作数组索引以便对值进行分类,但大概是有原因的,要么与语言相关,要么或在使签名成为更好选择的目标体系结构中。

这些原因是什么?

最佳答案

signed 关键字是在 C89 中添加的。在此之前,如果您将 charunsigned char 设为相同,则无法访问带符号的 char 大小的类型。因此,大多数早期的 C ABI 都定义了要签名的 char。 (尽管如此,也有异常(exception) — 如果没有任何异常(exception),C89 会强制 char 被签名。)

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

未开发的语言 设计将使charint8_t 分离基本类型,但如今C 的重要性在于大量现有代码;您不太可能看到这种变化。

(另请记住,在 1989 年,计算机和应用程序仅支持 7 位 ASCII 仍然很普遍。因此,文本数据的签名 char 的不便远不那么明显。您提到的那些查找表只有 128 个条目。将 char 设为 8 位符号实际上对于使用 7 位文本和使用的程序来说更方便第八位作为每个字符的标志。)

关于c++ - 为什么平台选择 signed char?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/37143231/

相关文章:

c++ - 用整数和 -Weffc++ 标志覆盖 +/-/*/%

c++调试递归函数并且它不会立即退出函数

c++ - 将 float 类型转换为 int 的正确方法是什么,反之亦然?

c - 参数中的字符串操作

c - 不属于的随机字节,SSL_read

c - 关于C中链表的下一个字段中最低有效位的声明

c++ - 随机生成一个没有重复元素的枚举数组(C++)

c++ - 从 session ID 获取正确的 token

C 程序错误 - 输出 0

c - 如何使用 MPI 并行化点积