考虑此C程序:
unsigned char c2 = '\0101';
printf("%c, %d\n", c2, c2);
我相信输出应该是:A 65,但实际输出是1 49。
原因:0作为字符常量的前缀以八进制格式声明,八进制值为101,则值为65。然后对应于65的ASCII值为A。有人可以告诉我我要去哪里了吗?我尝试使用与'\ x41'相同的十六进制代码,它给出了所需的输出。
八进制格式的字符的转义序列是一个反斜杠,后跟最多三位数字,这意味着最后一位数字不属于转义序列的一部分。这在C standard的6.4.4.4p1节中有关“字符常量”的规定中指定:
octal-escape-sequence: \ octal-digit \ octal-digit octal-digit \ octal-digit octal-digit octal-digit
所以'\0101'
实际上是一个多字节字符常量:第一个是\010
,它是值8,第二个是字符'1'
。
前导0
用于指定数字八进制常量,而不是character八进制常量,因此在这种情况下您不需要前导0:
unsigned char c2 = '\101';
如果您确实想使用数字八进制常量,则可以这样做:
unsigned char c2 = 0101;
此'\0101'
是一个多字节整数字符常量。类型为int
。它的内部表示是实现定义的。因此在内部可以表示为
0x00000849
在此声明中
unsigned char c2 = '\0101';
常量被截断为0x49
(最低有效字节),并分配给变量c2
。
因此,此值0x49
在调用printf
中作为字符和整数输出。