一个关于转义字符的疑问。。

Regnaiq 2016-03-16 10:01:40
转义字符也是一个字符,一般只占8位,看到书上说十六进制是\xhh还能理解,但是八进制为什么是\ooo有三位了?是不是第一位不能大于3?还看到一道题说转义字符‘\0014’是正确的,搞不太懂啊??

还顺便有一个问题。。-521作为无符号数输出的值,-521的补码应该是1111 1101 1111 0111,作为无符号输出时符号位直接当数值位,算出是65016,不知道对不对??

请各位指点
...全文
220 8 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
8 条回复
切换为时间正序
请发表友善的回复…
发表回复
Regnaiq 2016-03-18
  • 打赏
  • 举报
回复
引用 2 楼 qq_29120981 的回复:
第一个,三位八进制足以表示所有ASCII码 第二个,不是 第三个,语法上没有错误,'\0014'前三个数字和\构成转义字符,后一个4单独,这和'ab'类似,标准没有规定它的值到底是'a'呢还是'b'呢,全依赖编译器实现。
谢谢回答,经过strlen()实测,为什么‘\0014’就可以解析为两个字符(\001和4),而‘\x111’就会提示溢出,结果仍是长度为1?
Regnaiq 2016-03-18
  • 打赏
  • 举报
回复
引用 1 楼 wang0635 的回复:
标准中说: 6.4.4.4 Character constants Syntax octal-escape-sequence: \ octal-digit \ octal-digit octal-digit \ octal-digit octal-digit octal-digit hexadecimal-escape-sequence: \x hexadecimal-digit hexadecimal-escape-sequence hexadecimal-digit 看来,八进制的最多3位,十六进制可以有多位 第二个问题,负数如果是用补码,编程无符号数解释时,上面给出的结果就是对的
用strlen("\0014")得到2,用strlen("\x111")编译器却提示溢出,结果仍为1,而这是为什么?
赵4老师 2016-03-18
  • 打赏
  • 举报
回复
电脑内存或文件内容只是一个一维二进制字节数组及其对应的二进制地址; 人脑才将电脑内存或文件内容中的这个一维二进制字节数组及其对应的二进制地址的某些部分看成是整数、有符号数/无符号数、浮点数、复数、英文字母、阿拉伯数字、中文/韩文/法文……字符/字符串、汇编指令、函数、函数参数、堆、栈、数组、指针、数组指针、指针数组、数组的数组、指针的指针、二维数组、字符点阵、字符笔画的坐标、黑白二值图片、灰度图片、彩色图片、录音、视频、指纹信息、身份证信息…… 推荐使用WinHex软件查看硬盘或文件或内存中的原始字节内容。
wang0635 2016-03-18
  • 打赏
  • 举报
回复
溢出处理是由实现定义的,不同的编译器自己决定
小灸舞 版主 2016-03-18
  • 打赏
  • 举报
回复
引用 4 楼 yq_forever 的回复:
[quote=引用 1 楼 wang0635 的回复:] 标准中说: 6.4.4.4 Character constants Syntax octal-escape-sequence: \ octal-digit \ octal-digit octal-digit \ octal-digit octal-digit octal-digit hexadecimal-escape-sequence: \x hexadecimal-digit hexadecimal-escape-sequence hexadecimal-digit 看来,八进制的最多3位,十六进制可以有多位 第二个问题,负数如果是用补码,编程无符号数解释时,上面给出的结果就是对的
用strlen("\0014")得到2,用strlen("\x111")编译器却提示溢出,结果仍为1,而这是为什么?[/quote] C++03中,8进制转义字符可由1~3个数字组成,都是合法的;16进制转义字符的数字不限个数(>=1),并不是1~2位。 大部分编译器char都是八位,x111超过了上限,编译器会报错,可以用宽字符类型代替,改成这样:

(L"\x111")
Regnaiq 2016-03-18
  • 打赏
  • 举报
回复
引用 5 楼 小灸舞的回复:
[quote=引用 4 楼 yq_forever 的回复:] [quote=引用 1 楼 wang0635 的回复:] 标准中说: 6.4.4.4 Character constants Syntax octal-escape-sequence: \ octal-digit \ octal-digit octal-digit \ octal-digit octal-digit octal-digit hexadecimal-escape-sequence: \x hexadecimal-digit hexadecimal-escape-sequence hexadecimal-digit 看来,八进制的最多3位,十六进制可以有多位 第二个问题,负数如果是用补码,编程无符号数解释时,上面给出的结果就是对的
用strlen("\0014")得到2,用strlen("\x111")编译器却提示溢出,结果仍为1,而这是为什么?[/quote] C++03中,8进制转义字符可由1~3个数字组成,都是合法的;16进制转义字符的数字不限个数(>=1),并不是1~2位。 大部分编译器char都是八位,x111超过了上限,编译器会报错,可以用宽字符类型代替,改成这样:

(L"\x111")
[/quote] 谢谢~
醉花阴柳 2016-03-16
  • 打赏
  • 举报
回复
第一个,三位八进制足以表示所有ASCII码 第二个,不是 第三个,语法上没有错误,'\0014'前三个数字和\构成转义字符,后一个4单独,这和'ab'类似,标准没有规定它的值到底是'a'呢还是'b'呢,全依赖编译器实现。
wang0635 2016-03-16
  • 打赏
  • 举报
回复
标准中说: 6.4.4.4 Character constants Syntax octal-escape-sequence: \ octal-digit \ octal-digit octal-digit \ octal-digit octal-digit octal-digit hexadecimal-escape-sequence: \x hexadecimal-digit hexadecimal-escape-sequence hexadecimal-digit 看来,八进制的最多3位,十六进制可以有多位 第二个问题,负数如果是用补码,编程无符号数解释时,上面给出的结果就是对的

70,022

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧