首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >一个字符如何用包含三个八进制数字的位模式来表示?

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

Stack Overflow用户
提问于 2013-08-09 17:38:31
回答 3查看 1.1K关注 0票数 4

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

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

代码语言:javascript
复制
′\ooo′

其中ooo是1到3个八进制数字(0.7)或by

代码语言:javascript
复制
′\xhh′

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

代码语言:javascript
复制
#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是,1到3个八进制数字(0.7)。如果有三个八进制数字,所需的位数将为9(每个数字为3),这超过了字符所需的字节长度。我肯定是漏掉了什么东西。我错过了什么?

EN

回答 3

Stack Overflow用户

回答已采纳

发布于 2013-08-09 18:31:45

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

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

代码语言:javascript
复制
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如果没有使用前缀,“八进制或十六进制转义序列的值应在对应类型的可表示值范围内:无符号字符”

票数 4
EN

Stack Overflow用户

发布于 2013-08-09 17:39:35

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

如果K&R不这么说,他们的描述要么不完整,要么不正确。

票数 0
EN

Stack Overflow用户

发布于 2013-08-09 17:45:59

据我所知,在K&R中没有定义字符的代码编号范围。在早期,通常是ASCII 0.127。现在它通常是一个8位的范围,0.255,但它也可能更宽.无论如何,对char数据类型的实现定义的限制也意味着对转义符号的限制。

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/18152526

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档