char 文字的字符集是否保证为 ASCII?

Is the character set of a char literal guaranteed to be ASCII?

提问人:Luchian Grigore 提问时间:10/30/2012 最后编辑:CommunityLuchian Grigore 更新时间:10/31/2012 访问量:1183

问:

这里开始的讨论来看,标准是否指定了字符的值?那么,保证是48岁吗?这就是 ASCII 会告诉我们的,但它有保证吗?如果没有,你有没有见过任何编译器不是 48?'0''0'

C++ 标准 ASCII

评论

13赞 kennytm 10/30/2012
一个词:EBCDIC。
0赞 Nikos C. 10/30/2012
我很好奇你为什么要问这个。显然,您也可以将其用于值。'0'int
0赞 Luchian Grigore 10/30/2012
我问@NikosChantziaras是因为链接答案中的讨论,为什么我可以使用?'0'int48
0赞 damienh 10/30/2012
一个链接:扩展二进制编码十进制交换代码。
0赞 phuclv 8/26/2016
字符数字 ['0'..'9'] 需要具有连续的数值?

答:

16赞 CB Bailey 10/30/2012 #1

不。源字符集或执行字符集都不需要使用带有 ASCII 子集的编码。我还没有看到任何非 ASCII 实现,但我知道有人知道有人。(要求“0”-“9”具有连续的整数值,但这是 SO 上其他地方的重复问题。

用于源字符集的编码控制如何将源代码的字节解释为 C++ 语言中使用的字符。该标准将执行字符集的成员描述为具有值。正是编码将这些字符映射到它们的相应值,从而决定了 的整数值。'0'

尽管执行字符集中必须至少存在基本源字符集的所有成员以及一些控制字符和值为零的 null 字符(具有适当的值),但不要求编码为 ASCII 或对任何特定字符子集(null 字符除外)使用 ASCII 值。

评论

0赞 Ben Voigt 10/30/2012
我不得不处理一次包含备用字符集的数据文件(我甚至不认为它是 EBCDIC)。但是我使用ASCII编译器做到了这一点。
0赞 Andreas Brinck 10/30/2012
该段是 2.2/3 “上述十进制数字列表中 0 之后的每个字符的值应比前一个字符的值大 1。
2赞 Pete Becker 10/30/2012
源字符集和执行字符集是字符集,并且对这些字符集中至少必须包含哪些内容有特定要求。它是未指定的那些字符的编码(除了对“0”到“9”的约束)。这是一个重要的区别,如果被忽视,就会混淆关于角色的讨论。并不是说这里是一个问题......
11赞 Ben Voigt 10/30/2012 #2

不,该标准非常小心,没有指定源字符编码是什么。

C 和 C++ 编译器也运行在 EBCDIC 计算机上,你知道,在哪里。'0' != 0x30

但是,我认为需要.'1' == '0' + 1

评论

1赞 kennytm 10/30/2012
是必需的 (§2.3/3)。'1' == '0' + 1
0赞 Thomas Matthews 10/30/2012
这也意味着,这是将字符数字转换为数字的好方法。'5' - '0' == 5
3赞 Steve Jessop 10/30/2012 #3

它在 EBCDIC 中。我从未使用过 EBCDIC 编译器,但有人告诉我,它们在 IBM 风靡一时。0xF0

C++ 标准中没有要求源编码或执行编码是基于 ASCII 的。保证(并且通常数字是连续的和有序的)。不能保证这些字母是连续的,实际上在 EBCDIC 和 .'0' == '1' - 1'J' != 'I' + 1'S' != 'R' + 1

评论

0赞 Kerrek SB 10/30/2012
通过传递合适的编译器选项,您可以轻松地使 GCC 编译 EBCDIC(或任何)编码的源文件。
0赞 Ben Voigt 10/31/2012
@KerrekSB:这会影响二进制中字符串常量的编码,以及字符处理功能(例如),但是哪个选项会更改源编码?-fexec-charsetisdigit
0赞 Kerrek SB 10/31/2012
还有.-finput-charset
2赞 tomahh 10/30/2012 #4

根据 C++11 标准 N3225

基本源字符集成员的字形为 旨在识别 ISO/IEC 10646 子集中的字符,其中 对应于 ASCII 字符集。但是,由于映射 从源文件字符到源字符集(如 转换阶段 1) 被指定为实现定义的,一个 实现需要记录如何记录基本源字符 在源文件中表示

简而言之,字符集不需要映射到 ASCII 表,即使我从未听说过任何不同的实现