字符文字('A')是否完全等同于十六进制文字(0x41)

时间:2013-07-29 22:29:44

标签: c hex character literals

是否存在将'A'更改为0x41可能会改变我的计划行为的情况?如何将0x41更改为'A'?是否有任何不常见的体系结构或模糊的编译器设置或奇怪的宏可能使这些设置不完全相同?如果它们在符合标准的编译器中完全等效,那么是否有人遇到过错误或非标准的编译器,它们不一样?

2 个答案:

答案 0 :(得分:6)

是否存在将“A”更改为0x41可能会改变程序行为的情况?

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

C不需要ASCII字符集。

  

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

答案 1 :(得分:3)

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

C标准确实保证,无论它们的实际值是什么,字符文字'0''9'都将是连续的并且按递增的数字顺序排列,即如果i是整数在0到9之间,'0' + i将是该整数的十进制表示的字符。 'A''Z''a''z'必须按字母顺序递增,但是连续的,实际上它们不是EBCDIC连续出现。 (标准版的精确定制是为了允许ASCII和EBCDIC原样。)您可以使用'A' + i(或'a' + i)编码十六进制数字A到F,因为是< / em>在ASCII和EBCDIC中都是连续的,但 技术上是你正在逃避而不是保证的东西。