右移的问题 为什么结果不相同

ainijing 2009-08-01 12:12:08
int c = 0xcffffff3;
printf("%x\n", 0xcffffff3>>2);
printf("%x\n", c>>2);
...全文
134 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
自由建客 2009-08-04
  • 打赏
  • 举报
回复
有符号数右移操作不可移植,采用逻辑右移还是算术右移取决于编译器。
mu_yang 2009-08-01
  • 打赏
  • 举报
回复
回答好象都很轻率
DarkChampion 2009-08-01
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 mstlq 的回复:]
楼上的几位都答得好快^_^
[/Quote]

UP

因为0xcffffff3的最高位为1,在int中是符号位,用unsigned int才不会当负号
pengzhixi 2009-08-01
  • 打赏
  • 举报
回复
注意逻辑右移和算术右移
fice1989 2009-08-01
  • 打赏
  • 举报
回复
int c = 0xcffffff3; //给变量c分配一个内存空间,并且该内存空间的值为cffffff3
printf("%x\n", 0xcffffff3>>2); //cffffff3对这个数进行移位?
printf("%x\n", c>>2);//对变量c所在的地址内容进行移位
mstlq 2009-08-01
  • 打赏
  • 举报
回复
楼上的几位都答得好快^_^
liao05050075 2009-08-01
  • 打赏
  • 举报
回复
改成

unsigned int c = 0xcffffff3;
printf("%x\n", 0xcffffff3>>2);
printf("%x\n", c>>2);

就一样了。

原因是,int c是有符号数,对它进行移位时会有符号扩展,因为最高位为1,所以符号扩展是把前面空出来的两位填为1.
ies_sweet 2009-08-01
  • 打赏
  • 举报
回复
先顶个,关注
brookmill 2009-08-01
  • 打赏
  • 举报
回复
printf("%x\n", 0xcffffff3>>2); // 这个是无符号数右移,最高位补0
printf("%x\n", c>>2); // // 这个是负数右移,最高位补1
sidney 2009-08-01
  • 打赏
  • 举报
回复
unsigned int c = 0xcffffff3;就可以了
onlyjia 2009-08-01
  • 打赏
  • 举报
回复
c 中 变量默认是有符号的啊 汗
starcat 2009-08-01
  • 打赏
  • 举报
回复
按照Dennis M. Ritchie的说法,右移时符号位1的处理好象跟机器有关吧?

69,371

社区成员

发帖
与我相关
我的任务
社区描述
C语言相关问题讨论
社区管理员
  • C语言
  • 花神庙码农
  • 架构师李肯
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧