位运算与的有关问题

位运算与的问题
unsigned int z;
z=~0;
z=(z>>5)&(z<<(8));
printf("%0",z);
结果是3400也就是11100000000
a>>5=1111111111111111&z<<8=1111111100000000 按理说应该等于1111111100000000

------解决方案--------------------
探讨

右移位存在符号位扩展问题,unsigned类型用0扩展,signed类型大部分实现用符号位扩展,印象中C专家编程说过标准没有强制

------解决方案--------------------
无符号数右移填0,谁告诉你是1了.
------解决方案--------------------
我试验了一下,结果是777777400,也就是0111 1111 1111 1111 1111 0000 0000
z是unsigned 型,所以没有符号位,右移的时候左边用0补充,所以z>>5是 0X07ffffff.
另外楼主有笔误,printf("%0",z)是printf("%o",z)。