提问人:Luchian Grigore 提问时间:10/30/2012 最后编辑:CommunityLuchian Grigore 更新时间:10/31/2012 访问量:1183
char 文字的字符集是否保证为 ASCII?
Is the character set of a char literal guaranteed to be ASCII?
问:
从这里开始的讨论来看,标准是否指定了字符的值?那么,保证是48岁吗?这就是 ASCII 会告诉我们的,但它有保证吗?如果没有,你有没有见过任何编译器不是 48?'0'
'0'
答:
不。源字符集或执行字符集都不需要使用带有 ASCII 子集的编码。我还没有看到任何非 ASCII 实现,但我知道有人知道有人。(要求“0”-“9”具有连续的整数值,但这是 SO 上其他地方的重复问题。
用于源字符集的编码控制如何将源代码的字节解释为 C++ 语言中使用的字符。该标准将执行字符集的成员描述为具有值。正是编码将这些字符映射到它们的相应值,从而决定了 的整数值。'0'
尽管执行字符集中必须至少存在基本源字符集的所有成员以及一些控制字符和值为零的 null 字符(具有适当的值),但不要求编码为 ASCII 或对任何特定字符子集(null 字符除外)使用 ASCII 值。
评论
不,该标准非常小心,没有指定源字符编码是什么。
C 和 C++ 编译器也运行在 EBCDIC 计算机上,你知道,在哪里。'0' != 0x30
但是,我认为需要.'1' == '0' + 1
评论
'1' == '0' + 1
'5' - '0' == 5
它在 EBCDIC 中。我从未使用过 EBCDIC 编译器,但有人告诉我,它们在 IBM 风靡一时。0xF0
C++ 标准中没有要求源编码或执行编码是基于 ASCII 的。保证(并且通常数字是连续的和有序的)。不能保证这些字母是连续的,实际上在 EBCDIC 和 .'0' == '1' - 1
'J' != 'I' + 1
'S' != 'R' + 1
评论
-fexec-charset
isdigit
-finput-charset
根据 C++11 标准 N3225
基本源字符集成员的字形为 旨在识别 ISO/IEC 10646 子集中的字符,其中 对应于 ASCII 字符集。但是,由于映射 从源文件字符到源字符集(如 转换阶段 1) 被指定为实现定义的,一个 实现需要记录如何记录基本源字符 在源文件中表示
简而言之,字符集不需要映射到 ASCII 表,即使我从未听说过任何不同的实现
评论
'0'
int
'0'
int
48