1

在任何情况下更改'A'0x41可能会改变我的程序的行为?换成怎么0x41'A'?是否有任何不常见的架构或晦涩的编译器设置或奇怪的宏可能会使它们不完全等效?如果它们在符合标准的编译器中完全等效,是否有人遇到过它们不一样的错误或非标准编译器?

4

2 回答 2

6

在任何情况下将“A”更改为 0x41 可能会改变我的程序的行为?

是的,在 EBCDIC 字符集中'A'值不是0x41but 0xC1

C 不需要 ASCII 字符集。

(C99,5.2.1p1)“执行字符集成员的值是实现定义的。”

于 2013-07-29T22:31:30.170 回答
3

字符文字'A'和整数文字0x41都有 type int。因此,它们不完全相同的唯一情况是基本执行字符集不是基于 ASCII 的,在这种情况下'A' 可能具有其他值。您可能遇到的唯一非 ASCII 基本执行字符集是EBCDIC,其中'A' == 0xC1.

C 标准确实保证,无论它们的实际值可能是什么,字符文字'0'通过'9'将是连续的并且以递增的数字顺序排列,即如果i是介于 0 和 9 之间的整数,'0' + i将是该整数的十进制表示的字符。 'A'through'Z''a'through'z'需要按字母顺序递增,但不能连续,实际上它们在 EBCDIC 中也不连续。(standardese 被精确地定制为允许 ASCII 和 EBCDIC 原样。)您可以使用'A' + i(或'a' + i)对十六进制数字 A 到 F 进行编码,因为它们在 ASCII 和 EBCDIC 中都是连续的,但它技术上讲,这是您可以逃脱的事情,而不是有保证的事情。

于 2013-07-29T22:33:18.217 回答