C 通过printf命令打印八进制数

C 通过printf命令打印八进制数,c,C,我一直在尝试理解八进制数的printf功能。 如果我将代码编写为: int main() { char *s = "\123"; printf("%s",s); } 它给了我一个S的输出,这实际上是正确的,因为S的ASCII是八进制的123。 但我的问题是,编译器如何识别要从八进制转换的数字序列。例如: char *s = "\123456" 将输出为S456 八进制转换最多需要3个数字吗 八进制是否有最大限制(最大3位八进制数为777) 现在因为最多有255个ascii字符(八进

我一直在尝试理解八进制数的printf功能。 如果我将代码编写为:

int main()
{
  char *s = "\123";
  printf("%s",s);
}
它给了我一个S的输出,这实际上是正确的,因为S的ASCII是八进制的123。 但我的问题是,编译器如何识别要从八进制转换的数字序列。例如:

char *s = "\123456" 
将输出为S456

八进制转换最多需要3个数字吗

八进制是否有最大限制(最大3位八进制数为777)

现在因为最多有255个ascii字符(八进制377),所以当我尝试打印777时,它会打印一个典型的� ascii字符,这是假定可能是,因为没有这样的ascii分配给这个数字。 此功能是否依赖于编译器/操作系统


我希望我的回答非常清楚,因为这是我在这里的第一个问题:-)

在数字前面加一个“0”,在编译器中将其标识为八进制。例:0123

将“0x”放在数字之前,将其标识为编译器的十六进制。例如:0x123

否则它是十进制的。例:123

char*s=“\123456”

对于您的示例转义序列,\123是一个十进制数。编译器知道只使用3位数字,因为字符范围在0-255之间,因此它的上限为3位

顺便说一句,十进制123的字符是“S”,这就是为什么字符串是“S456”

  • 对。八进制字符文字的最大值为三位数。从规范6.4.4.4字符常量中:

    八进制转义序列:
    \
    八进制数字
    \
    八进制数字八进制数字
    \
    八进制数字八进制数字八进制数字

    十六进制转义序列:
    \x
    十六进制数字
    十六进制转义序列十六进制数字

  • 如您所述,最大八进制转义序列为
    \777
    。十六进制转义序列没有最大限制,从上面的规范引用中可以看出


  • 只有128个ASCII字符(0-127)。这意味着您可以对ASCII使用八进制
    \000
    \177
    。如果您使用不同的字符集,您可能可以在8位字符中转到
    \377
    ,并在
    \777
    (或更高版本,使用十六进制转义序列)中转到
    wchar\u t
    。说明书上说:

    对于整型字符常量,八进制或十六进制转义序列的值应在类型
    的可表示值范围内,对于宽字符常量,应在类型
    对应的无符号类型的可表示值范围内

    在大多数计算机上,
    无符号字符
    是一种8位类型,在该上下文中将八进制转义序列限制为
    \377
    ,将十六进制序列限制为
    \xff
    。在32位
    wchar\u t
    上下文的情况下,十六进制序列可能高达
    \xfffffff

  • C99标准(我可以看一下)为字符串定义了
    八进制转义序列
    ,如下所示:

    octal-escape-sequence:
        \ octal-digit
        \ octal-digit octal-digit
        \ octal-digit octal-digit octal-digit
    
    因此,任何
    八进制转义序列
    最多有3个八进制数字(
    0
    7

    解释简单地说:

    八进制转义序列中反斜杠后面的八进制数字被视为整数字符常量的单个字符或宽字符常量的单个宽字符构造的一部分。这样形成的八进制整数的数值指定所需字符或宽字符的值

    而且

    每个八进制或十六进制转义序列都是可以使用的最长字符序列 构成逃逸序列

    以及以下限制条件:

    对于整型字符常量,八进制或十六进制转义序列的值应在类型unsigned char的可表示值范围内,对于宽字符常量,应在对应于wchar__t的无符号类型的可表示值范围内


    因此,如果最多使用8位(
    CHAR\u-BIT
    9
    ),则值
    \777
    违反约束。我在规范中找不到这方面的内容,我想这是未定义的行为,因此依赖于编译器。

    错了。ASCII 123(十进制)是
    {
    。这个答案是如何获得赞成票的?你是对的,我错了。但我不知道为什么它会将转义序列作为八进制。我想我会继续读下去。因为这是规范定义的。没有十进制转义序列。八进制123是十进制83,对应于S@Lundin:转义值本质上不必是八进制。有人如果转义是十进制的,就像我想的,那么字符串应该是“{456”而不是“123456”。转义将适用,并且仍然需要。
    \777
    如果字符位为9或更大,则是合法的。
    wchar\u t
    可能也足够大,可以容纳
    \777
    。它可能是16位或更大。
    \777
    是实现定义的(在8位字符平台上),而不是未定义的行为(6.4.4.4/10)。谢谢,删除了该部分。只有128个ASCII字符。谢谢carl提供的深入解决方案。我非常感谢。