即使char已签名,'a'和'0'也始终具有正值?

chq*_*lie 13 c character-encoding language-lawyer

根据环境和编译器设置,char默认情况下类型可以是有符号或无符号的,这意味着8位2s补码系统上单个字符常量的值范围可以是-128..1270..255.

在无处不在的ASCII字符集中,其ISO-8859-X扩展或UTF-8编码,大写和小写字母以及数字的值低于127.

但是EBCDIC字符集不是这种情况:

'A'是0xC1,'a'是0x81并且'1'是0xF1.

由于这些值大于127,是否意味着该类型char必须在8位EBCDIC系统上无符号?或者可以'a','A''1'有负值?

其他字符集怎么样?字母或数字可以有负值吗?

hid*_*kgb 14

C99指出:

6.2.5类型

声明为char类型的对象足够大,可以存储基本执行字符集的任何成员.

如果基本执行字符集的成员存储在char中,则其值保证为非负值.

因此,如果所讨论的机器使用EBCDIC编码和8位char,那么为该机器设计的C99兼容编译器必须char是无符号的.

  • 更确切地说:如果有问题的机器具有8位字符并使用EBCDIC编码,那么为此机器设计的C99兼容编译器必须默认使用unsigned char-s. (2认同)