对 unsigned char 先左移 后右移 可以出现两种结果解决思路

对 unsigned char 先左移 后右移 可以出现两种结果
关于>>  << (左移 右移)今天发现一个搞笑问题

首先,我的编译器是VS2010

我在做个C++  Dll的时候发现:

对一个  unsigned char 先左移 后右移 可以出现两种结果:

1.
int n = 4;
unsigned char  tempib = 0Xff;
tempib = ( tempib<<n) >> n; //去掉tempib 的前n 位,n是个变量
2.
int n = 4;
unsigned char  tempib = 0Xff;
tempib = tempib<<n; //去掉tempib 的前n 位,n是个变量
tempib = tempib>>n;

我的天呀,1 和2的结果不一样呀。1是:0XFF ,2是:0X0F
破编译器,你左移右移变成4字节操作,好吧,我没意见。能不能不要在一个寄存器里,动都不动,直接移动。
骂归骂,我还是挺喜欢这编译器的,那个编译器没有点不爽的地方
------解决方案--------------------
有点意思。
unsigned char  tempib = 0Xff;
tempib = ( tempib<<n) >> n;
这个相当于
unsigned char  tempib = 0Xff;
unsigned int tmp = ((unsigned int)tempib)<<n;  // tmp = 0xff0
tmp >>= n; // tmp = 0xff
tempib = tmp;
------解决方案--------------------
我用gcc和g++都得到和楼主一样的结果
------解决方案--------------------
整形提升造成的问题,确实挺隐蔽的。
------解决方案--------------------
这个确实有些隐蔽