如何用包含三个八进制数字的位模式表示一个字符?

时间:2013-08-09 17:38:31

标签: c character constants octal

关于C编程语言的K& R书的第2章(2.3节命名常量):

  

某些字符可以用字符和字符串表示   转义序列的常量,如\ n(换行符);这些序列看起来   像两个字符,但只代表一个。另外,任意   字节大小的位模式可以由

指定
′\ooo′
  

其中ooo是一到三个八进制数字(0 ... 7)或

′\xhh′
  

其中hh是一个或多个十六进制数字(0 ... 9,a ... f,A ... F)。所以   我们可以写

#define VTAB ′\013′    /* ASCII vertical tab */
#define BELL ′\007′    /* ASCII bell character */

or, in hexadecimal,
#define VTAB ′\xb′     /* ASCII vertical tab */
#define BELL ′\x7′     /* ASCII bell character */

令我困惑的部分是以下措辞(强调我的):其中ooo是一到三个八进制数字(0 ... 7)。如果有三个八进制数字,则所需的位数将为9(每个数字为3),这超过了字符所需的字节长度。当然,我在这里遗漏了一些东西。我错过了什么?

3 个答案:

答案 0 :(得分:4)

\ooo(3个八进制数字)确实允许指定9位值0到111111111(二进制)或511.如果允许这取决于char大小。

下面的分配会在许多环境中生成警告,因为在这些环境中,char是8位 。通常,允许的最高八进制序列是\377。但是char不需要是8位。 OP的“9 ...超过字符所需的字节长度”是不正确的。

char *s = "\777";  //warning "Octal sequence out of range"
char c  = '\777';  //warning
int i   = '\777';  //warning

在使用ASCII的典型环境中,3个八进制数字常量'\141''a'相同。但在另一个字符集中,'a'可能不同。因此,如果想要将便携式位模式分配为01100001,则可以使用'\141'而不是'a'。人们可以通过分配'\x61'来实现同样的目标。在某些情况下,八边形图案可能是优选的。

C11 6.4.4.4.9如果没有使用前缀,“八进制或十六进制转义序列的值应在相应类型的可表示值范围内:unsigned char”

答案 1 :(得分:0)

如果我们讨论的是8位字节,那么第一个八进制数字只允许变为3(2位),而不是7(3位)。如果我们谈论ASCII(7位值),第一个数字只能是零或一个。

如果K& R另有说明,则说明其描述不完整或不正确。

答案 2 :(得分:0)

据我所知,K& R中没有定义字符的代码编号范围。在早期,它通常是ASCII范围0 ... 127。如今它通常是8位范围,0 ... 255,但它也可能更宽。在任何情况下,char数据类型的实现定义限制也意味着对转义符号的限制。

例如,如果范围是0 ... 127,则\177是允许的最大八进制转义。