免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 1661 | 回复: 8
打印 上一主题 下一主题

c程序中的常量是如何被处理的? [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2005-01-16 15:42 |只看该作者 |倒序浏览
main()
{
int a;
a=1+2;
printf("%d",a);
}
如上面程序,编译程序是如何处理表达式中的常量1 和2 的?
也是为其分配相应内存空间,并在运行时随程序一同加载到内存中的吗?

论坛徽章:
0
2 [报告]
发表于 2005-01-16 15:57 |只看该作者

c程序中的常量是如何被处理的?

这里的常量被处理为立即数,没有分配空间

论坛徽章:
0
3 [报告]
发表于 2005-01-16 16:35 |只看该作者

c程序中的常量是如何被处理的?

如果执行printf("%d",3276  呢? 如果是立即数结果应该是32768而不是
-32768

论坛徽章:
0
4 [报告]
发表于 2005-01-16 16:41 |只看该作者

c程序中的常量是如何被处理的?

原帖由 "wang_songyan" 发表:
如果执行printf("%d",3276  呢? 如果是立即数结果应该是32768而不是
-32768


不明白你的意思

论坛徽章:
0
5 [报告]
发表于 2005-01-16 17:18 |只看该作者

c程序中的常量是如何被处理的?

即使是立即数,它在内存中也应占具一定的存储空间吧,没有地址怎么取操作数?

论坛徽章:
0
6 [报告]
发表于 2005-01-16 17:21 |只看该作者

c程序中的常量是如何被处理的?

[quote]原帖由 "wang_songyan"]即使是立即数,它在内存中也应占具一定的存储空间吧[/quote 发表:


我不这么认为。
比如一个printf(“%d”, 12345);编译器读到这段指令的时候就会翻译成类似于:
push 12345
call _printf
这样的汇编指令,然后汇编器再把这段指令翻译成机器指令,这样是不占内存的。

论坛徽章:
0
7 [报告]
发表于 2005-01-17 09:20 |只看该作者

c程序中的常量是如何被处理的?

converse 讲的基本上是正确的。但要说的是,任何信息都是要占内存的.所谓立即数,也就是该常数是作为指令的一部分.也就是说,该常数
存放在内存中的代码段.

论坛徽章:
0
8 [报告]
发表于 2005-01-17 09:36 |只看该作者

c程序中的常量是如何被处理的?

同意converse。
printf(3276=-32768是因为编译的时候上面的句子就被编译成printf(-3276了。你用的是16位环境,溢出了。
如果你反汇编一下a=1+2的编译结果,你还会发现他实际上相当于直接的a=3。

论坛徽章:
0
9 [报告]
发表于 2005-01-17 09:58 |只看该作者

c程序中的常量是如何被处理的?

原帖由 "wang_songyan" 发表:
如果执行printf("%d",3276  呢? 如果是立即数结果应该是32768而不是
-32768


我明白你地意思了,你这个应该属于溢出的情况。
举一个简单地例子吧,假设有一台机器是2位的,那么对于一个2位表示的有符号数来说,数值的范围是-2~1,也就是说是2^(n-1)~2^(n-1)-1,其中n是cpu的位数。这样,在这个假设存在的2位的cpu中,-2的有符号的二进制表示是10,而2也是10,但是2不在它的表示范围之内(前面说过有符号数的范围是-2~1),因此计算机就把它解释成为-2了.

具体的你可以去看看微机原理中讲述补码表示和有符号,无符号数的表示,对于printf这样的函数而言,你需要记住一点:里面的格式化字符串决定了如何去解释数据,同样的数据,不同的解释方法是不一样的,比如:

  1. int x = -12345;
  2. printf("x = %hdn", x); /* 输出-12345 */
  3. printf("x = %hun", x); /* 输出53191 */
复制代码

当然,上面的这个测试程序是在32位机子上的,16位的可能不一样。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP