请教各位一个问题,拜托。

2019 年 5 月 9 日
 leye

请求个小问题,实在是搞不清楚了 如题:

char len_array[] = {'\15', '\0', '\0', '\0'};
int *len_p = (int *) len_array;
int len = *len_p;
printf("%d\n", len);

结果为什么是 13 呢?

3529 次点击
所在节点    C
17 条回复
firebroo
2019 年 5 月 9 日
因为 8 进制。。
SeaRecluse
2019 年 5 月 9 日
int('\15') = 13
不过我也不知道为啥
强制转换之后输出应该是 13,0,0,0 才对吧
为何我输出:
13
0
1925797100
9697452
leye
2019 年 5 月 9 日
@firebroo 多谢多谢
SeaRecluse
2019 年 5 月 9 日
不知道是不是因为第一个\0 已经结束了字符,后面俩成野地址了
ZgblKylin
2019 年 5 月 9 日
https://en.wikipedia.org/wiki/String_literal#Escape_sequences

转义符号\不是这么用的。
你要存数字就直接写数字 15。

转移符号\后面跟数字时,只有两种写法,一种是直接跟八进制数字,一种是\x 跟十六进制数字。
你这里写的\15,那就是八进制 15,也就是十进制 13
xinglp
2019 年 5 月 9 日
要考虑大小端吧
besto
2019 年 5 月 9 日
@SeaRecluse int 和 char 的长度不一样, 如果一个 int 4 字节, char 1 字节, 那么仅有 13 是有效的(这一点还要在 little endian 的情况下).
leye
2019 年 5 月 9 日
@SeaRecluse 确实是我忽略了八进制的转义符号导致的,我的电脑上 int 是 4 个字节,c 是从低到高写的,所以是
00001101 00000000 00000000 00000000 所以就是 13 了
leye
2019 年 5 月 9 日
对的还有大小端
leye
2019 年 5 月 9 日
@ZgblKylin 多谢
across
2019 年 5 月 9 日
是考转移字符和内存排布吧。

上面其实说完了。
4byte 的内存,用 char 方式写入数据,然后以 int 方式读取。
PTLin
2019 年 5 月 9 日
https://s2.ax1x.com/2019/05/09/EgyILn.png
你的机器应该是小端法的,最低有效字节排在最前面。
leye
2019 年 5 月 9 日
@PTLin Cool~
wheeler
2019 年 5 月 9 日
luozic
2019 年 5 月 9 日
大小端和进制问题 还是很重要的
leye
2019 年 5 月 10 日
@luozic 多谢多谢
leye
2019 年 5 月 10 日
@wheeler 多谢多谢

这是一个专为移动设备优化的页面(即为了让你能够在 Google 搜索结果里秒开这个页面),如果你希望参与 V2EX 社区的讨论,你可以继续到 V2EX 上打开本讨论主题的完整版本。

https://v2ex.xtra.eu.org/t/562576

V2EX 是创意工作者们的社区,是一个分享自己正在做的有趣事物、交流想法,可以遇见新朋友甚至新机会的地方。

V2EX is a community of developers, designers and creative people.

© 2021 V2EX