我看到很多关于 signed/unsigned char 的答案,但不是这个确切的问题,所以如果已经有答案,请随时关闭/复制。
我知道在 C 和 C++ 中,数据类型“char”可以是有符号的也可以是无符号的。我知道不同的平台选择不同,但是 x86 和我个人使用的所有其他平台都选择了 'char' 进行签名。
在我看来,选择 unsigned char 有一些小优势,例如,如果您愿意,可以将值用作数组索引以便对值进行分类,但大概是有原因的,要么与语言相关,要么或在使签名成为更好选择的目标体系结构中。
这些原因是什么?
signed
关键字是在 C89 中添加的。在此之前,如果您将 char
和 unsigned char
设为相同,则无法访问带符号的 char
大小的类型。因此,大多数早期的 C ABI 都定义了要签名的 char
。 (尽管如此,也有异常(exception) — 如果没有任何异常(exception),C89 会强制 char
被签名。)
从那时起,我们在假设 char
已签名的代码之间有一个连续的反馈循环(因为程序员从未见过没有 ABI 的地方,所以为什么还要打一个额外的词?) 和 ABI 将 char
定义为已签名,以确保与尽可能多的现有代码兼容。
未开发的语言 设计将使char
和int8_t
分离基本类型,但如今C 的重要性在于大量现有代码;您不太可能看到这种变化。
(另请记住,在 1989 年,计算机和应用程序仅支持 7 位 ASCII 仍然很普遍。因此,文本数据的签名 char
的不便远不那么明显。您提到的那些查找表只有 128 个条目。将 char
设为 8 位符号实际上更对于使用 7 位文本和使用的程序来说更方便第八位作为每个字符的标志。)