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