printf("%x\n",0xcffffff3>>2);中的0xcffffff3没有赋给变量,编译器把它按其大小解释为无称号数;而int f = 0xcffffff3;中的f是int型,0xcffffff3由于最高位是1,就按负数取补存放了。无论正数负数,右移位时符号位是跟随的,所以造成结果不同。
根据编译器的不同,int类型数据所占据的空间是不同的,有的是2个字节,有的是4个字节。如果是2个字节的,你所表达的数据就超过了范围,所以显示的结果就不一定一样了。
int f = 0xcffffff3;
转化为整形的超过了int的范围,所以变成负数,然后移动就出问题了
f>>2 进行的是带符号右移最高位补符号位,这里是1,最后得到值为f3fffffc
0xcffffff3>>2 进行的是不带符号右移最高位补0 最后得到值为33ffffc