| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 1640 人关注过本帖, 2 人收藏
标题:一道简单的C程序,但输出结果难解释,请高手回答
只看楼主 加入收藏
lyhorange
Rank: 1
来 自:黑龙江
等 级:新手上路
帖 子:1
专家分:2
注 册:2009-9-27
收藏
得分:1 
dui
2009-09-27 09:21
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:1 
回复 6楼 gxhzzhj
要说明这个问题,得了解一下参数的传递方法。

32769 这个数,写成二进制是这样的:
0000 0000 0000 0000 1000 0000 0000 0001
为了方便,把它写成16进制,那么是这样:
0 0 0 0 8 0 0 1
按字节就是:
00 00 80 01

程序在运行到printf时,由main负责求出参数的值,并将之压入栈中,以便被调函数使用。
在intel兼容机里,内存都是使用一种叫做 little endian(中文有好多叫法,低位低址呀,小端在前之类的,我也不清楚)的方式储存的。把低位的数放在低地址,就是低位在前的意思。所以那个数压入堆栈之后,就会变成下面这个顺序:01 80 00 00。

本来参数传递有按照从左到右的顺序,还是从双到左的顺序标准是没有规定的(虽然大多数的实现都是从右到左的顺序压栈)。好在这个程序前后传的两个参数值一样,所以这个顺序不影响结果。main函数负责传递两个参数,它们压入堆栈之后,栈中的数据就是下面这个样子:

01 80 00 00, 01 80 00 00 (为了方便阅读,我加了个逗号。)

之后调用了printf,它也不知道传的参数是什么类型,只好看格式串中相应的类型描述符。
再这里,你先后写的是 %d 和 %ld
在TC中,int 是2个字节的,所在printf在看了%d 后,从栈中读了两个字节: 01 80,然后解译成 int 的值输出。
01 80 是 little endian 的顺序,所以是80 01,这个数就是 -32767。
接着,printf 又看见了 %ld。就是 long,四个字节的,所以又去读了4个字节:00 00 01 80 (其实从这就可以看出来,传的参数已经乱套了,这四个字节数是第一个参数的后两个字节,和第二个参数前两个。跨越了我上面加的逗号)
这是 little endian 的。所以其实是:80 01 00 00, 这个数是 -2147418112。

你可以自己写个例子试试看,比如:
程序代码:
#include <stdio.h>
int main(void)
{
    int a = 0x8001;
    long b = 0x80010000;
   
    printf("%d, %ld\n", a, b);
    return 0;
}

看看结果是不是一样的。


顺便解译一下,不同的编译器编译的结果也不一定是一样的。TC中的 int 是2个字节的,相当于 short。其它很多编译中的 int 都是4个字节,相当于 long。在这种情况下,传 int 和传 long 是没有什么区别的,也就不会出现你说的这个问题了。
2009-09-27 09:31
rangelee
Rank: 2
等 级:论坛游民
帖 子:17
专家分:18
注 册:2009-7-4
收藏
得分:1 
回复 12楼 pangding
首先同情楼主的遭遇,在中国式的教育学府中遇到问题问老师能得到正确答案的几率类似于买彩票中奖的几率,PANGDING看了你的解释,让我茅塞顿开,C中各种数据类型是不能随便混用的,在编写程序过程中这些小问题会常常被忽视,最后会造成各种意想不到的效果。

[ 本帖最后由 rangelee 于 2009-9-27 12:19 编辑 ]
2009-09-27 12:14
lbh110148110
Rank: 1
等 级:新手上路
帖 子:1
专家分:2
注 册:2009-9-22
收藏
得分:1 
学习了!
2009-09-27 12:26
末末309104535
Rank: 2
来 自:湘 益阳 编成小学
等 级:论坛游民
帖 子:70
专家分:27
注 册:2009-2-17
收藏
得分:1 
超 出了范围了就像3分之1 乘以3等于1   而0点3乘以3等于0点9 这怎么解释 也许那些数学家都能解释,每人都不可能是数学家所以只要知道他是这样算就可以了
2009-09-27 21:12
pangding
Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19Rank: 19
来 自:北京
等 级:贵宾
威 望:94
帖 子:6784
专家分:16751
注 册:2008-12-20
收藏
得分:0 
回复 15楼 末末309104535
呵呵,这问题数学家是用级数来解释的~~ (在下数学系出身,必须秀一秀)
2009-09-27 23:21
飞天的猪
Rank: 3Rank: 3
等 级:论坛游侠
帖 子:67
专家分:141
注 册:2009-9-19
收藏
得分:1 
受教了
2009-09-27 23:32
快速回复:一道简单的C程序,但输出结果难解释,请高手回答
数据加载中...
 
   



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

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