当前位置: 代码迷 >> C语言 >> [讨论]位移+自增运算!
  详细解决方案

[讨论]位移+自增运算!

热度:140   发布时间:2007-11-07 19:07:34.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;
}
图片是第一个:


在看看位移运算:
#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的值无变化?
如个将int b=((a<<3)-(a<<6))改为int b=((a<<3)-(a<<3))则b=0;
总的说来就是a在位移中没有边化



----------------解决方案--------------------------------------------------------

#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编辑过]


----------------解决方案--------------------------------------------------------
我想我是了解了,看看大家的意见!
有可能很简单!
----------------解决方案--------------------------------------------------------
同意3楼的说法!
----------------解决方案--------------------------------------------------------
#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,具体是多少,你分析分析。
----------------解决方案--------------------------------------------------------

#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) 。
位操作不回改变原来的数字,位操作产生一个新的数字。
*/


----------------解决方案--------------------------------------------------------
以下是引用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); /* 这种写法在不同的编译器上会产生不同的结果 */


----------------解决方案--------------------------------------------------------

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


----------------解决方案--------------------------------------------------------
回8楼:

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