为什么八进制序列'\ 0101'不等于65十进制?

问题描述 投票:0回答:1

考虑此C程序:

unsigned char c2 = '\0101';
printf("%c, %d\n", c2, c2);

我相信输出应该是:A 65,但实际输出是1 49

原因:0作为字符常量的前缀以八进制格式声明,八进制值为101,则值为65。然后对应于65的ASCII值为A。有人可以告诉我我要去哪里了吗?我尝试使用与'\ x41'相同的十六进制代码,它给出了所需的输出。

c output
1个回答
7
投票

八进制格式的字符的转义序列是一个反斜杠,后跟最多三位数字,这意味着最后一位数字不属于转义序列的一部分。这在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;

-1
投票

'\0101'是一个多字节整数字符常量。类型为int。它的内部表示是实现定义的。因此在内部可以表示为

0x00000849

在此声明中

unsigned char c2 = '\0101';

常量被截断为0x49(最低有效字节),并分配给变量c2

因此,此值0x49在调用printf中作为字符和整数输出。

© www.soinside.com 2019 - 2024. All rights reserved.