我已经发现,C99标准有一个语句,它否认类型char与类型已签名char/unsigned之间的兼容性。
C99标准的注释35:
在Lims.h中定义的CHAR_MIN将有一个值0或SCHAR_MIN,这可以用来区分这两个选项。无论所作的选择如何,char都是与其他两种类型不同的类型,与两者都不兼容。
我的问题是,为什么委员会不承认这种兼容性?理由何在?如果字符与符号字符或无符号字符兼容,那么会发生什么可怕的事情吗?
发布于 2012-10-07 14:18:15
根在编译器历史中。在八十年代,基本上有两种C方言:
这些C89中的哪一个应该标准化?C89选择两种方法都不标准化,因为它会使C代码中已经编写的大量假设失效--标准人员称之为已安装的基础。因此,C89做了K&R所做的事情:保留普通char实现定义的签名性。如果你需要一个特定的符号,限定你的字符。现代编译器通常允许您选择带有选项的方言(例如。gcc的-funsigned-char)。
如果你忽略(Un)符号字符和普通字符之间的区别,可能会发生“可怕”的事情:如果你做算术和移位而没有考虑到这些细节,那么当你不期望它们时,你可能会得到符号扩展,反之亦然(甚至在移动时没有定义的行为)。
还有一些愚蠢的建议,建议总是使用显式的有符号或无符号的限定符来声明字符。只要您只使用指向这类限定类型的指针,但当您处理字符串和字符串函数时,它就需要丑陋的强制转换,而这些字符串和字符串函数都是在指针到普通字符上操作的,这是赋值不兼容的,没有强制转换。这样的代码突然间被大量丑陋到骨子里的铸型抹黑了。
“宪章”的基本规则是:
char,如果需要将指针传递给接受普通字符的函数unsigned charsigned char,但是如果空格不需要考虑,请考虑使用int发布于 2012-10-07 14:12:43
将signed char和unsigned char看作最小的算术、积分类型,就像signed short/unsigned short,以及int、long int、long long int等等。这些类型都有明确的规定.
另一方面,char的用途非常不同:它是I/O的基本类型,也是与系统通信的基本类型。它不是用来计算的,而是数据的单位。这就是为什么在命令行参数、“字符串”定义、FILE*函数和其他读/写类型IO函数中以及在严格混叠规则的例外中使用的FILE*。这种char类型的定义不那么严格,以便允许每个实现使用最“自然”的表示。
这只是一个分离责任的问题。
(不过,char确实是与signed char和unsigned char兼容的布局,因此可以显式地将其中一个转换为另一个和back。)
https://stackoverflow.com/questions/12769500
复制相似问题