来自从这里开始的讨论,标准是否指定字符的值?那么,'0'
保证是48?这就是 ASCII 会告诉我们的,但它可以保证吗?如果没有,你见过'0'
不是 48 的编译器吗?
4 回答
不。源字符集或执行字符集都不需要使用带有 ASCII 子集的编码。我还没有看到任何非 ASCII 实现,但我知道有人知道有人有。(要求 '0' - '9' 具有连续的整数值,但这是 SO 其他地方的重复问题。)
用于源字符集的编码控制如何将源代码的字节解释为 C++ 语言中使用的字符。该标准将执行字符集的成员描述为具有值。正是编码将这些字符映射到它们对应的值,从而确定 的整数值'0'
。
尽管在执行字符集中至少必须存在基本源字符集的所有成员以及一些控制字符和一个值为 0 的空字符(具有适当的值),但不要求编码是 ASCII 或对任何特定的字符子集(空字符除外)使用 ASCII 值。
不,标准非常小心,没有指定源字符编码是什么。
C 和 C++ 编译器也在 EBCDIC 计算机上运行,你知道,'0' != 0x30
.
但是,我认为这是必需的'1' == '0' + 1
。
它0xF0
在 EBCDIC 中。我从未使用过 EBCDIC 编译器,但有人告诉我,它们在 IBM 曾经风靡一时。
C++ 标准中没有要求源或执行编码是基于 ASCII 的。可以保证'0' == '1' - 1
(并且通常数字是连续且有序的)。不能保证字母是连续的,实际上在EBCDIC'J' != 'I' + 1
和'S' != 'R' + 1
.
根据 C++11 标准 N3225
基本源字符集成员的字形旨在识别对应于 ASCII 字符集的 ISO/IEC 10646 子集中的字符。然而,因为从源文件字符到源字符集的映射(在翻译阶段 1 中描述)被指定为实现定义的,所以需要一个实现来记录基本源字符在源文件中是如何表示的
简而言之,字符集不需要映射到 ASCII 表,即使我从未听说过任何不同的实现