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;
}
右移运算右移运算符“>>”是双目运算符。其功能是把“>>
”左边的运算数的各二进位全部右移若干位,“>>”右边的数指定移动的位数。
例如:设
a=15,a>>2
表示把000001111右移为00000011(十进制3)。应该说明的是,对于有符号数,在右移时,符号位将随同移动。当为正数时,
最高位补0,而为负数时,符号位为1,最高位是补0或是补1
取决于编译系统的规定。Turbo
C和很多系统规定为补1。
我运算的结果也是后面三个一样。
唯一可以解释的就是系统在右移的时候空位补了1,而原因也只能是因系统而异。我用的是Visual
C++6.0
你在scanf中写入了提示语句的话,你在输入的时候也要输入这些语句。。如:
记得请输入一个年份你也要写进去。。。或者你最好向一楼说的,用printf来提示。
#include
void
main()
{
int
a;
scanf("请输入一个年份:%d",&a);
if((a%4==0&&a%100!=0)||a%400==0)
printf("这一年是闰年。");
else
printf("这一年是平年。");
}