我一直在尝试理解八进制数的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 :(得分:8)
是。三位数字是八进制字符文字的最大值。来自规范 6.4.4.4字符常量:
八进制转义序列:
\
八位数
\
八位数八位数
\
八进制数字八进制数字八进制数字十六进制转义序列:
\x
十六进制数字
十六进制 - 转义 - 序列十六进制数字
如您所述,最大八进制转义序列为\777
。从上面的规范引用中可以看出,十六进制转义序列没有最大限制。
只有128个ASCII字符(0-127)。这意味着您可以使用八进制\000
到\177
进行ASCII。如果您使用不同的字符集,则可以在8位字符中转到\377
,并且\777
(或更高,使用十六进制转义序列)转到{wchar_t
1}}。规范说:
对于整数字符常量,八进制或十六进制转义序列的值应在
unsigned char
类型的可表示值范围内,或者对应于的无符号类型wchar_t
表示宽字符常量。
在大多数机器上,unsigned char
是一个8位类型,在此上下文中将八进制转义序列限制为\377
,将十六进制序列限制为\xff
。对于32位wchar_t
上下文,十六进制序列可能与\xffffffff
一样高。
答案 1 :(得分:3)
C99标准(我可以看一下)为字符串定义octal-escape-sequence
:
octal-escape-sequence:
\ octal-digit
\ octal-digit octal-digit
\ octal-digit octal-digit octal-digit
因此,任何octal-escape-sequence
最多包含3个八进制数字(0
到7
)。
解释简单地说明:
八进制转义序列中反斜杠后面的八进制数字被视为构造整数字符常量的单个字符或宽字符常量的单个宽字符的一部分。这样形成的八进制整数的数值指定了所需字符或宽字符的值。
另外,
每个八进制或十六进制转义序列是最长的字符序列 构成逃脱序列。
以下约束:
八进制或十六进制转义序列的值应在整数字符常量的unsigned char类型的可表示值范围内,或者对应宽字符常量的wchar_t的无符号类型。
因此,如果使用最多8位(\777
< CHAR_BIT
),则值9
违反约束。 我在规范中找不到这个,我猜它是未定义的行为,因此编译器依赖。
答案 2 :(得分:0)
在数字前加上'0'将其标识为编译器的八进制数。例如:0123
在数字前加上'0x'将其标识为编码器的十六进制数。例如:0x123
否则为十进制。例如:123
char * s =“\ 123456”
对于示例转义序列,\ 123是十进制数。编译器知道只使用3位数,因为字符的范围是0-255,因此它将限制为3位数。
BTW十进制123的字符是'S',这就是你的字符串是“S456”的原因。 击>