【问题标题】:Why do platforms pick signed char? [duplicate]为什么平台选择签名字符? [复制]
【发布时间】:2016-09-05 17:01:26
【问题描述】:

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

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

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

这些原因是什么?

【问题讨论】:

  • 一致性? int = signed int,所以一致性需要char = signed char(只是猜测)
  • 我问它的一个原因是我正在玩“有趣”的编译器,我发现很难理解为什么人们选择“签名”......虽然无符号的优点是次要的,它们似乎存在。我敢肯定,一定是有原因的。
  • 如果您的处理器架构仅对小于寄存器大小的内存位置进行符号扩展负载,则保持 char 符号可提高性能。不过,我不知道有任何架构可以做到这一点。
  • @anatolyg charsigned char 是不同的类型。

标签: c++ c


【解决方案1】:

在 C89 中添加了 signed 关键字。在此之前,如果您将charunsigned char 设为相同,则无法访问已签名的char 大小的类型。因此,大多数早期的 C ABI 都将 char 定义为要签名的。 (即便如此,也有例外——如果没有任何例外,C89 会强制签名char。)

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

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

(还请记住,在 1989 年,计算机和应用程序仅支持 7 位 ASCII 仍然很常见。因此,签名 char 对文本数据的不便之处就不太明显了。那些查找表你提到的只有 128 个条目。让char 被 8 位签名实际上对于使用 7 位文本并使用第 8 位作为每个字符标志的程序来说更方便。 )

【讨论】:

  • 这也为优化留下了空间。例如。一些 MCU 没有也没有(例如 MSP430)有有符号或无符号字节加载指令。无论如何,我认为这是另一个问题的重复。
  • 是的,完全同意int8_tchar 的基本类型相同的痛苦。当我忘记这一点(就像我一样!)时,我什至无法表达沮丧,并在一些诊断中打印它(期望数字输出),只是在我的日志中发现一些无法打印的随机事物。现在我必须在确保我投射后重做整个测试用例!
猜你喜欢
  • 2014-02-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-12-18
  • 2017-02-11
  • 1970-01-01
  • 2020-10-28
  • 1970-01-01
相关资源
最近更新 更多