【问题标题】:Why doesn't the octal sequence '\0101' equal 65 decimal?为什么八进制序列 '\0101' 不等于十进制 65?
【发布时间】:2019-12-24 16:37:16
【问题描述】:

考虑这个 C 程序:

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

我认为输出应该是:A 65,但实际输出是1 49

推理:0作为字符常量中的前缀以八进制格式声明,八进制值101是65。那么65对应的ASCII值是A。有人能告诉我哪里出错了吗?我尝试了与 '\x41' 相同的十六进制代码,它给出了所需的输出。

【问题讨论】:

  • 我不知道你是否注意到 btw,如果你删除 0 (\101),你会得到想要的输出
  • @user3121023 八进制 escape 序列。八进制文字没有这个限制。
  • @Archer unsigned char c2 = 0101 作品
  • 因为语法是0x41
  • 请注意,在'\xA74129' 中,有三个字节的十六进制;与八进制不同,构成十六进制转义 \xXXX 的十六进制字符的数量没有限制。也没有要求十六进制转义中的字符数是偶数。请参阅 C11 §6.4.4.4 Character constants,其中明确指定了 1 到 3 个八进制数字和不受限制的十六进制。

标签: c output


【解决方案1】:

八进制格式字符的转义序列是一个反斜杠,后跟最多三位数字,这意味着最后一个数字不是转义序列的一部分。这在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 用于指定 numeric 八进制常量,而不是 character 八进制常量,因此在这种情况下您不需要前导 0:

unsigned char c2 = '\101';

如果您确实想使用数字八进制常量,您可以这样做:

unsigned char c2 = 0101;

【讨论】:

【解决方案2】:

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

0x00000849

在此声明中

unsigned char c2 = '\0101';

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

所以这个值0x49printf 调用中作为一个字符和一个整数输出。

【讨论】:

    猜你喜欢
    • 2018-06-09
    • 2011-08-21
    • 1970-01-01
    • 1970-01-01
    • 2016-08-15
    • 2016-09-04
    • 2011-02-04
    • 2018-01-26
    • 1970-01-01
    相关资源
    最近更新 更多