| 网站首页 | 业界新闻 | 小组 | 威客 | 人才 | 下载频道 | 博客 | 代码贴 | 在线编程 | 编程论坛
欢迎加入我们,一同切磋技术
用户名:   
 
密 码:  
共有 621 人关注过本帖
标题:[讨论]位移+自增运算!
只看楼主 加入收藏
yangzhifu
Rank: 1
等 级:新手上路
威 望:2
帖 子:433
专家分:0
注 册:2007-4-11
收藏
 问题点数:0 回复次数:9 
[讨论]位移+自增运算!
看看如下的自增运算:
#include<stdio.h>
int
main()
{
int a=1;
int b=a-(++a);
printf("The a is :%d and the b is %d:\n",a,b);
return 0;
}
图片是第一个:


在看看位移运算:
#include<stdio.h>
int
main()
{
int a=1;
int b=((a<<3)-(a<<6));
printf("The a is :%d and the b is %d:\n",a,b);
return 0;
}
图片附件: 游客没有浏览图片的权限,请 登录注册

图片附件: 游客没有浏览图片的权限,请 登录注册

搜索更多相关主题的帖子: 位移 运算 
2007-11-07 19:07
yangzhifu
Rank: 1
等 级:新手上路
威 望:2
帖 子:433
专家分:0
注 册:2007-4-11
收藏
得分:0 
问题:
为什么在位移中a的值无变化?
如个将int b=((a<<3)-(a<<6))改为int b=((a<<3)-(a<<3))则b=0;
总的说来就是a在位移中没有边化



方寸之内,剖天下; 方坛之内,析自我;
2007-11-07 19:10
cosdos
Rank: 9Rank: 9Rank: 9
来 自:ShangHai
等 级:蜘蛛侠
威 望:6
帖 子:2109
专家分:1385
注 册:2007-6-19
收藏
得分:0 

#include<stdio.h>
int
main()
{
int a=1;
int b=a-(++a);
printf("The a is :%d and the b is %d:\n",a,b);
return 0;
}

这个 a-(++a) 在不同编译器下是会产生不同结果的。
有的编译器会得到 - 1 ,而有的会得到 0 。
C 的标准(ANSI C 或 C99)并没有规定这些。(这些都是编译器定义的)

DEV-C++ 上
a = 1;
b = a - (++a);
会先把 a + 1,再 a + a,得到 0。

VC 好像会得到 -1。 (我只装了 DEV-C++)

[此贴子已经被作者于2007-11-7 19:18:16编辑过]


—>〉Sun〈<—
2007-11-07 19:11
yangzhifu
Rank: 1
等 级:新手上路
威 望:2
帖 子:433
专家分:0
注 册:2007-4-11
收藏
得分:0 
我想我是了解了,看看大家的意见!
有可能很简单!

方寸之内,剖天下; 方坛之内,析自我;
2007-11-07 19:13
yangzhifu
Rank: 1
等 级:新手上路
威 望:2
帖 子:433
专家分:0
注 册:2007-4-11
收藏
得分:0 
同意3楼的说法!

方寸之内,剖天下; 方坛之内,析自我;
2007-11-07 19:15
qq95620412
Rank: 1
等 级:新手上路
帖 子:81
专家分:0
注 册:2007-11-5
收藏
得分:0 
#include<stdio.h>
int
main()
{
int a=1;
int b=((a<<3)-(a<<6)); //详见后文
printf("The a is :%d and the b is %d:\n",a,b);
return 0;
}



a<<3只是求出a左移3位后的值,a的值是不变的
a=1,a<<3的值为9,a<<6的值是65,9-65当然等于-56了
要想达到你的目的,应写成

int b=(a<<=3)-(a<<=6)

同样 int b=(a<<3)-(a<<3)的值是0,而
int b=(a<<=3)-(a<<=3)的值也就不再是0,具体是多少,你分析分析。

人生路难走,转眼已白头。伤心望远山,黯然下小楼。
2007-11-07 19:22
cosdos
Rank: 9Rank: 9Rank: 9
来 自:ShangHai
等 级:蜘蛛侠
威 望:6
帖 子:2109
专家分:1385
注 册:2007-6-19
收藏
得分:0 

#include<stdio.h>

int main(void)
{
int a = 1;
int b =((a << 3) - (a << 6)); /*| b = (a * 8) - (a * 64) |*/
printf("The a is :%d and the b is %d:\n",a,b);

getchar();
return 0;
}

/*
所有的编译器都应该一样,
因为先得到(a << 3)这个数字,然后再 减去 (a << 6) 。
位操作不回改变原来的数字,位操作产生一个新的数字。
*/


—>〉Sun〈<—
2007-11-07 19:23
cosdos
Rank: 9Rank: 9Rank: 9
来 自:ShangHai
等 级:蜘蛛侠
威 望:6
帖 子:2109
专家分:1385
注 册:2007-6-19
收藏
得分:0 
以下是引用qq95620412在2007-11-7 19:22:05的发言:
#include<stdio.h>
int
main()
{
int a=1;
int b=((a<<3)-(a<<6)); //详见后文
printf("The a is :%d and the b is %d:\n",a,b);
return 0;
}



a<<3只是求出a左移3位后的值,a的值是不变的
a=1,a<<3的值为9,a<<6的值是65,9-65当然等于-56了
要想达到你的目的,应写成

int b=(a<<=3)-(a<<=6)

同样 int b=(a<<3)-(a<<3)的值是0,而
int b=(a<<=3)-(a<<=3)的值也就不再是0,具体是多少,你分析分析。

b=(a<<=3)-(a<<=3); /* 这种写法在不同的编译器上会产生不同的结果 */


—>〉Sun〈<—
2007-11-07 19:25
yangzhifu
Rank: 1
等 级:新手上路
威 望:2
帖 子:433
专家分:0
注 册:2007-4-11
收藏
得分:0 

谢谢俩位!
我了解了很多!
总结一下:
b = a - (++a);同b=(a<<=3)-(a<<=3);的原理相同,而b=(a<<3)-(a<<6)的a是不变的!


方寸之内,剖天下; 方坛之内,析自我;
2007-11-07 19:32
qq95620412
Rank: 1
等 级:新手上路
帖 子:81
专家分:0
注 册:2007-11-5
收藏
得分:0 
回8楼:

我也考虑过 这个问题 , 应该是和编译器在对 逆波兰式 进行优化的方法不同产生的吧?

人生路难走,转眼已白头。伤心望远山,黯然下小楼。
2007-11-07 22:03
快速回复:[讨论]位移+自增运算!
数据加载中...
 
   



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

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