/* Note:Your choice is C IDE */
#include "stdio.h"
int main()
{
unsigned char a=0x11;
unsigned char b=(~a)<<4;//对a先按位取反,原因有括号,非优先级高,所以~a=~(00010001)=11101110,再左移四位,其余各位补0,原因是char是8位,所以应该是b=11100000=224
printf("b=%d\n",b);
b=~a<<4; //同上,非的优先最高
printf("b=%d\n",b);
b=~(a<<4); //移四位后取反,括号的优先级高,b=~(00010000)=11101111=239
printf("b=%d\n",b);
//前2个的结果是一样的,b=~(a<<4); 的结果与前面的不一样 正常!可到了右移位的时候出现了问题
b=(~a)>>4; //上面可知取反后的结果是11101110,右移四位,b=00001110=14
printf("b=%d\n",b);
b=~(a>>4); //a右移四位后是00000001,取反后是b=11111110=254
printf("b=%d\n",b);
b=~a>>4; //同样非的优先级高,结果也是14
printf("b=%d\n",b);
//上面三个printf的结果都是一样的 而且无论a为任何值
return 0;
}
//楼主一定是搞错了,后面三个结果是不一样的,我运行了,你再仔细看下,再运行下
参考下下面的运算的优先级
http://hi.baidu.com/pingguo2500/blog/item/ef922b08fb4295d563d986c1.html
如果都是254,只可能是补1了,这应该和系统有关系,我用的是C与C++程序设计学习与实验系统 2009.7
运行结果和分析是一样的
C++中的位运算符,只能用于int和unsigned int类型的,宽度小于int的会被隐式转化成int。
左移当然没问题,因为截断的时候用不到高位,右移的时候,高位的1被截到b中,造成无论移位和取反的顺序,结果都是一样的。
#include
#include
int main()
{
unsigned char a=0x11;
unsigned char b=(~a)<<4;
printf("b=%d\n",b);
b=~a<<4;
printf("b=%d\n",b);
b=~(a<<4);
printf("b=%d\n",b);
//前2个的结果是一样的,b=~(a<<4); 的结果与前面的不一样 正常!可到了右移位的时候出现了问题
b=(~a)>>4;
printf("b=%d\n",b);
b=~(a>>4);
printf("b=%d\n",b);
b=~a>>4;
printf("b=%d\n",b);
printf("b=%x\n",(~a)>>4);
printf("b=%x\n",~(a>>4));
printf("b=%x\n",~a>>4);
printf("%d\n",sizeof(a<<4));
printf("%d\n",sizeof(a>>4));
printf("%d\n",sizeof(~a));
//上面三个printf的结果都是一样的 而且无论a为任何值
return 0;
}
我的用的是 Win-TC 编译器
运行结果
b=224
b=224
b=239
b=14
b=254
b=14
没有问题,估计是和 编译器 有关
LZ用的是什么编译器啊?
右移运算右移运算符“>>”是双目运算符。其功能是把“>> ”左边的运算数的各二进位全部右移若干位,“>>”右边的数指定移动的位数。
例如:设 a=15,a>>2 表示把000001111右移为00000011(十进制3)。应该说明的是,对于有符号数,在右移时,符号位将随同移动。当为正数时, 最高位补0,而为负数时,符号位为1,最高位是补0或是补1 取决于编译系统的规定。Turbo C和很多系统规定为补1。
我运算的结果也是后面三个一样。
唯一可以解释的就是系统在右移的时候空位补了1,而原因也只能是因系统而异。我用的是Visual C++6.0