首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >问答首页 >为什么char不兼容已签名字符或未签名字符?

为什么char不兼容已签名字符或未签名字符?
EN

Stack Overflow用户
提问于 2012-10-07 14:06:00
回答 2查看 2.8K关注 0票数 9

我已经发现,C99标准有一个语句,它否认类型char与类型已签名char/unsigned之间的兼容性。

C99标准的注释35:

在Lims.h中定义的CHAR_MIN将有一个值0或SCHAR_MIN,这可以用来区分这两个选项。无论所作的选择如何,char都是与其他两种类型不同的类型,与两者都不兼容。

我的问题是,为什么委员会不承认这种兼容性?理由何在?如果字符与符号字符或无符号字符兼容,那么会发生什么可怕的事情吗?

EN

回答 2

Stack Overflow用户

发布于 2012-10-07 14:18:15

根在编译器历史中。在八十年代,基本上有两种C方言:

  1. 其中普通字符被签名
  2. 其中普通字符未签名

这些C89中的哪一个应该标准化?C89选择两种方法都不标准化,因为它会使C代码中已经编写的大量假设失效--标准人员称之为已安装的基础。因此,C89做了K&R所做的事情:保留普通char实现定义的签名性。如果你需要一个特定的符号,限定你的字符。现代编译器通常允许您选择带有选项的方言(例如。gcc的-funsigned-char)。

如果你忽略(Un)符号字符和普通字符之间的区别,可能会发生“可怕”的事情:如果你做算术和移位而没有考虑到这些细节,那么当你不期望它们时,你可能会得到符号扩展,反之亦然(甚至在移动时没有定义的行为)。

还有一些愚蠢的建议,建议总是使用显式的有符号或无符号的限定符来声明字符。只要您只使用指向这类限定类型的指针,但当您处理字符串和字符串函数时,它就需要丑陋的强制转换,而这些字符串和字符串函数都是在指针到普通字符上操作的,这是赋值不兼容的,没有强制转换。这样的代码突然间被大量丑陋到骨子里的铸型抹黑了。

“宪章”的基本规则是:

  • 对字符串使用普通的char,如果需要将指针传递给接受普通字符的函数
  • 如果您需要进行位旋转和字节转移,请使用unsigned char
  • 如果您需要小的有符号值,请使用signed char,但是如果空格不需要考虑,请考虑使用int
票数 11
EN

Stack Overflow用户

发布于 2012-10-07 14:12:43

signed charunsigned char看作最小的算术、积分类型,就像signed short/unsigned short,以及intlong intlong long int等等。这些类型都有明确的规定.

另一方面,char的用途非常不同:它是I/O的基本类型,也是与系统通信的基本类型。它不是用来计算的,而是数据的单位。这就是为什么在命令行参数、“字符串”定义、FILE*函数和其他读/写类型IO函数中以及在严格混叠规则的例外中使用的FILE*。这种char类型的定义不那么严格,以便允许每个实现使用最“自然”的表示。

这只是一个分离责任的问题。

(不过,char确实是与signed charunsigned char兼容的布局,因此可以显式地将其中一个转换为另一个和back。)

票数 2
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/12769500

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档