C Do';a';和';0';即使字符有符号,也始终具有正值?

C Do';a';和';0';即使字符有符号,也始终具有正值?,c,character-encoding,language-lawyer,C,Character Encoding,Language Lawyer,根据环境和编译器设置,默认情况下,char类型可以是有符号的或无符号的,这意味着8位2s补码系统上单字符常量的值范围可以是-128..127或0..255 在无处不在的ASCII字符集中,其ISO-8859-X扩展名或UTF-8编码、大小写字母以及数字的值低于127 但以下情况并非如此: 'A'是0xC1,'A'是0x81,'1'是0xF1 由于这些值高于127,这是否意味着在8位EBCDIC系统上类型char必须是无符号的?或者'a','a'和'1'可以有负值吗 其他字符集呢?字母或数字会有负

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

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

但以下情况并非如此:

'A'
是0xC1,
'A'
是0x81,
'1'
是0xF1

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

其他字符集呢?字母或数字会有负值吗?

表示:

6.2.5类型

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

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


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

可能重复的@squemishossifrage:根本不重复。“我问的问题比参考文献中的问题要精确得多。”斯奎米什弗雷奇:我很清楚这个令人遗憾的事实。我想问的是,我们是否可以始终假设
'a'>0
,尤其是在EBCDIC系统上,
'a'
具有8位编码
1000 0001
@chqrlie“基本执行字符……保证为非负。”。是我要找的地方。问得好。@chux:谢谢你的建议。我想这个问题对于周六晚上来说太微妙了。更准确地说:如果所讨论的机器有8位字符并使用EBCDIC编码,那么为这台机器设计的C99兼容编译器默认情况下必须使用无符号字符。@chqrlie任何系统都必须提供
无符号字符
,你的意思是说普通的
char
应该是无符号的。纯字符是与
无符号字符
不同的一种类型,因此我认为使用术语
无符号字符
来表示纯字符是无符号的是令人困惑的。此外,C11 5.2.1/3定义了基本执行字符集,包括
'a'
'0'
供参考,C90中出现了非常类似的措辞:“声明为char类型的对象足够大,可以存储基本执行字符集的任何成员。如果$2.2.1中枚举的所需源字符集的成员存储在char对象中,则其值保证为正数