| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 617 人关注过本帖
标题:关于16进制输出的问题
只看楼主 加入收藏
无聊恢恢
Rank: 2
等 级:论坛游民
帖 子:21
专家分:20
注 册:2012-7-19
结帖率:100%
收藏
已结贴  问题点数:10 回复次数:6 
关于16进制输出的问题
int main{
    int a[5] = {1,2,3,4,5};
   
    printf("&x\n",*(int *)((int)a + 1));
}
输出为2000000 求解释!
2012-07-21 10:51
lonmaor
Rank: 16Rank: 16Rank: 16Rank: 16
来 自:郑州
等 级:版主
威 望:75
帖 子:2637
专家分:6423
注 册:2007-11-27
收藏
得分:0 
不知道你想干嘛

从不知道到知道,到知道自己不知道,成长的道路上脚步深深浅浅
2012-07-21 16:26
madfrogme
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:21
帖 子:1160
专家分:1106
注 册:2009-6-24
收藏
得分:0 
你是不是把 % 打成了 &?

The quieter you become, the more you can hear
2012-07-21 18:26
无聊恢恢
Rank: 2
等 级:论坛游民
帖 子:21
专家分:20
注 册:2012-7-19
收藏
得分:0 
对啊 打错了 是 printf("%x\n",*(int *)((int)a + 1));
不好意思
2012-07-21 21:27
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:10 
解释倒是能解释:
看那个数组在内存里的样子(只有前两个有影响)

1 2 的二进制码分别是(括号里的是十六进制表示,逗号分隔字节):
0000 0000  0000 0000  0000 0000  0000 0001 (00,00,00,01)
0000 0000  0000 0000  0000 0000  0000 0010 (00,00,00,02)

intel 的字节序是 little-endian,也就是说存在内存里的是这个样子:
!0000 0001!0000 0000  0000 0000  0000 0000 (!01!00,00,00)
 0000 0010  0000 0000  0000 0000  0000 0000 ( 02,00,00,00)

a 本来指向的 1 的起始,也就是上面红色叹号的位置。加一之后,向后挪了一个字节也就是蓝色叹号那里。再输出 int 就是从那里取四个字节,是 (00,00,00,02) 由 little-endian 便是十六进制的 2000000。

但这种写法是危险的,结果也不具有移植性。
有些机器或者编译器对数据段的数据有严格的对齐限制:a 是 int 类型,所以 a 的齐起始地址在内存里一定是 4(即 sizeof(int))的整数倍。向前进了一字节后,地址被4除余一,在这个地址上进行 int 的读取操作会引发寻址异常。通常程序会表现为段错误。
2012-07-21 23:35
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
另外楼主的程序:
①:main 后面应该有一对括号。
②:数组后面的那个分号也应该是半角(英文状态)的分号。
③:虽然有人提了,printf 里应该是 %。
④:虽然写不写都可以,不过最好还是在返回 int 的函数最后加上 return 0;

很难想像,这么一个比 hello world 还短的程序能犯这么多错误。
楼主最好先编译编译自己写的程序,这样可以方便其他人直接拷贝运行。

还是就是,如果楼主的基本功不是太好的话,不建议研究这种没什么太大实际意义的代码。一般这类代码涉及的概念比较多。
2012-07-21 23:43
madfrogme
Rank: 20Rank: 20Rank: 20Rank: 20Rank: 20
等 级:版主
威 望:21
帖 子:1160
专家分:1106
注 册:2009-6-24
收藏
得分:0 
回复 5楼 pangding
我等新手好像理解起来有困难

The quieter you become, the more you can hear
2012-07-22 15:12
快速回复:关于16进制输出的问题
数据加载中...
 
   



关于我们 | 广告合作 | 编程中国 | 清除Cookies | TOP | 手机版

编程中国 版权所有,并保留所有权利。
Powered by Discuz, Processed in 0.067921 second(s), 7 queries.
Copyright©2004-2024, BCCN.NET, All Rights Reserved