在什么情况下,将'A'改为0x41可以改变我的程序的行为?把0x41改为'A'怎么样?是否有任何不寻常的体系结构或晦涩的编译器设置或奇怪的宏可能使这些宏不完全等效?如果它们在符合标准的编译器中完全等价,那么是否有人遇到过错误或非标准编译器,而它们并不相同?
发布于 2013-07-29 22:31:30
在什么情况下,将“A”改为“0x41”可以改变我程序的行为?
是的,在EBCDIC字符集中,'A'值不是0x41,而是0xC1。
C不需要ASCII字符集。
(C99,5.2.1p1)“执行字符集成员的值是实现定义的。
发布于 2013-07-29 22:33:18
字符文本'A'和整数文本0x41都具有int类型。因此,唯一不完全相同的情况是,基本执行字符集不是基于ASCII的,在这种情况下,'A'可能具有其他一些值。唯一可能遇到的非ASCII基本执行字符集是EBCDIC,其中'A' == 0xC1。
C标准确实保证,无论它们的实际值是什么,通过'9'的字符文本'9'都将是连续的,并且是以递增的数字顺序进行的,也就是说,如果i是包含在0到9之间的整数,那么'0' + i将是该整数的十进制表示的字符。'A'通过'Z','a'通过'z'需要按字母顺序递增,但不能是连续的,而且它们在EBCDIC中并不是连续的。(该标准是专门为ASCII和EBCDIC制定的。)您可以使用'A' + i (或'a' + i)对十六进制数字A到F进行编码,因为它们在ASCII和EBCDIC中都是连续的,但从技术上讲,这是一种可以逃避的东西,而不是有保证的东西。
https://stackoverflow.com/questions/17935313
复制相似问题