为什么答案为" printf("%d",' 0 /');"是12335?

时间:2014-09-27 20:33:22

标签: c ascii

这是c代码:

int main(int argc, const char *argv[])
{
    printf("%d", '0/');
    return 0;
}

输出为12335!然后我尝试将'0 /'替换为'00'和'000',输出变为12336和3158064,而12336 = 48 *(1 + 2 ^ 8),3158064 = 48 *(1 + 2 ^ 8 + 2 ^ 16)。但是,我还是不知道为什么。当'0 /'转换为输出的整数时会发生什么?

PS:我的电脑是MBP,操作系统是OS X 10.9.5(13F34)。编译器是Apple LLVM 6.0。

3 个答案:

答案 0 :(得分:3)

您构建了一个"多字符文字"。行为是实现定义的,但在您的情况下,整数值是由ASCII值构成的(12235 == 48 * 256 + 47)。

答案 1 :(得分:2)

'0/'是一个多字符常量,这意味着它具有实现定义的值。在您的情况下,字符的ASCII值为0x30 0x2f。这些组合成0x302f,等于12335。

答案 2 :(得分:2)

因为0/int类型的多字符常量。用它初始化2x3缓冲区的第一部分,并将其传递给printf以重新解释为int,第一个字节'0'乘以256然后第二个字节字节'/'被添加到其中。这会产生您看到的值:

printf("%d %d %d", '0', '/', '0'*256+'/');

打印

48 47 12335

demo

请注意,此行为与系统有关。在其他系统上,您可以看到12080而不是12335

有关多字符常量的更多信息,请参阅this answer