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

2019-05-09 16:34:19 +08:00
 leye

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

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

结果为什么是 13 呢?

2803 次点击
所在节点    C
17 条回复
firebroo
2019-05-09 16:50:03 +08:00
因为 8 进制。。
SeaRecluse
2019-05-09 16:56:14 +08:00
int('\15') = 13
不过我也不知道为啥
强制转换之后输出应该是 13,0,0,0 才对吧
为何我输出:
13
0
1925797100
9697452
leye
2019-05-09 16:56:20 +08:00
@firebroo 多谢多谢
SeaRecluse
2019-05-09 16:58:46 +08:00
不知道是不是因为第一个\0 已经结束了字符,后面俩成野地址了
ZgblKylin
2019-05-09 16:59:09 +08:00
https://en.wikipedia.org/wiki/String_literal#Escape_sequences

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

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

上面其实说完了。
4byte 的内存,用 char 方式写入数据,然后以 int 方式读取。
PTLin
2019-05-09 17:27:21 +08:00
https://s2.ax1x.com/2019/05/09/EgyILn.png
你的机器应该是小端法的,最低有效字节排在最前面。
leye
2019-05-09 17:33:29 +08:00
@PTLin Cool~
wheeler
2019-05-09 20:51:15 +08:00
luozic
2019-05-09 20:53:04 +08:00
大小端和进制问题 还是很重要的
leye
2019-05-10 06:19:17 +08:00
@luozic 多谢多谢
leye
2019-05-10 06:19:32 +08:00
@wheeler 多谢多谢

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

https://www.v2ex.com/t/562576

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

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

© 2021 V2EX