‘\ddd‘转义字符与八进制转换

所有的ASCII码都可以用“\”加数字(一般是8进制数字)来表示。而C中定义了一些字母前加"\"来表示常见的那些不能显示的ASCII字符,如\0,\t,\n等,就称为转义字符,因为后面的字符,都不是它本来的ASCII字符意思了。

——以上来自百度百科转义字符

直接看代码吧


char c1 = '\012';
char c2 = '\0123';
char c3 = '\0a12';
printf("%c,%c,%c\n",c1,c2,c3);

猜一猜,输出结果是什么?

……

……

……

公布答案:

 在屏幕上实际输出了一个换行符 '\n' 一个字符 '3' 一个字符 '2'

\ddd

1到3位八进制数所代表的任意字符            三位八进制

 是不是有点懵啊,不是说好的八进制吗,第一个 '\n' 的ascall码为10,刚好等于八进制的 '\012'

为什么后两个算出来后的值却是 32 啊?

下面在看一组测试用例你就懂了:

	char c4   = '\007';
	//char c4_1 = '\400';
	char c4_2 = '\377';
	char c4_3 = '\0377';
	char c4_4 = '\03a7';
	char c4_4 = '\a07';

老规矩,猜一猜,输出结果是什么?

……

……

……

 是不是还是有点懵啊,别急,再看一张图

下面揭晓谜题,其实 \ddd 最多只支持三位数字,并且三位数字也不是任意的,一旦大于等于八进制数 '/400 '(十进制256=8进制400)就超过了ascall码的范围,编译器就会报错。另外大于三位,或者遇到非八进制数字时则转换结束,直接取末尾数字。所以现在再回头去看看是不是发现很简单吧。

以免我的表述不够准确,在举个小栗子:

  • char ch = '\062'      ch等于字符 ‘2‘  ,十进制ascall码值为50,

该式把十进制的ascall对应值的字符赋值给ch                                            等同于ch = '2'; 或ch=50;

  • char ch = '\0012'    ch等于字符 '2'  ,十进制ascall码值为50,

 过长,进行截断。该式截取最后一个2,以字符'2'的形式 赋值给ch          等同于ch = '2'; 或ch=50;

  • char ch = '\009'       ch等于字符 '9'  ,十进制ascall码值为57,

该式把十进制的ascall对应值的字符赋值给ch                                             等同于ch = '9'; 或ch=57;

  • char ch = '\0009'     ch等于字符 '9'  ,十进制ascall码值为57,

 过长,进行截断。该式截取最后的 以字符'9'的形式赋值给ch             等同于ch = '9'; 或ch=57;

 

 

总结:

使用 '\ddd' 方法赋值实际上是将八进制数字通过转义字符 '\' 赋值为ascii表中对应的字符。

char ch = '\60';  char ch = 48;  char ch = '0'; 这三个语句是一样的效果。

只不过第一种是通过八进制的方式,第二种是通过10进制的方式,三种是通过字符的方式。

ascii表:

另外需要注意的是,使用字符赋值的时候,单引号‘’通常只写一个字符。因为char类型只占一个字节,如果写入字符过多,也只会取其中一个字符。

如:char ch = 'ABC'; 最终ch的值为'C'。

 

---

 

引用:CPU大端和小端模式详解

大端
大端(Big-endian)模式,是指数据的高字节保存在内存的低地址中,而数据的低字节保存在内存的高地址中

这样的存储模式有点儿类似于把数据当作字符串顺序处理:地址由小向大增加,而数据从高位往低位放;这种存放方式符合人类的正常思维。

小端
小端(Little-endian)模式,是指数据的高字节保存在内存的高地址中,而数据的低字节保存在内存的低地址中

这种存储模式将地址的高低和数据位权有效地结合起来,高地址部分权值高,低地址部分权值低,和我们的逻辑方法一致。

 

---

 

仅测试在我的windows,和Linux上都将此语句执行后,ch保存为'C'。由此猜测它们都是以小端的方式存储数据。

因为内存地址是连续的,并且我们使用时按从小到大排列,因此对于小端存储来说就是交错存储。如图:

 

并且,对于计算机来说,每8位二进制为一字节(2个16进制数),而我们使用小端存储 ch 时就做了这样的事。

并且,由于ch是char类型,只能容纳一个字节的数据,因此在对ch所在地址解析时,按照char类型1个字节解析,所得数值为十六进制数 0x43,通过我们所使用的字符编码显示出字符为 'C'。

同样的,对于int类型也是一样的存储方式。

 
uploading.4e448015.gif转存失败 重新上传 取消

 

 

uploading.4e448015.gif转存失败 重新上传 取消

 

 

  • 50
    点赞
  • 133
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 10
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 10
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

我叫RT

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值