移位运算符问题

qinken547 2011-03-26 07:34:09
有下面一段代码:
int i = 0xcffffff3;
printf("%x\n", 0xcffffff3>>2);
printf("%x\n", i>>2);

在GCC编译器中运行結果是
33ffffffc
f3ffffffc
是什么原因造成第二个运行結果?
在一本书上有个说法GCC编译器中如果是有符号数且为负右移位的话,高位补1,难道这里把i当成有符号的负数,每移一位就补1???
...全文
91 6 打赏 收藏 转发到动态 举报
写回复
用AI写文章
6 条回复
切换为时间正序
请发表友善的回复…
发表回复
we_sky2008 2011-03-26
  • 打赏
  • 举报
回复
楼主可以验证0xcffffff3是被编译器处理未无符号数还是有符号数:

//定义一组重载函数
void func(int)
{
cout<<"int"<<endl;
}
void func(unsigned int)
{
cout<<"unsigned int"<<endl;
}

//然后调用:
func(0xcffffff3);
we_sky2008 2011-03-26
  • 打赏
  • 举报
回复
关于有符号数的右移操最高位不确定,请参阅如下资料:
《C和指针》 page 68
《C++ primer》第三版 page 137
《The C Programming Language》第二版 page 39
we_sky2008 2011-03-26
  • 打赏
  • 举报
回复

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

首先对有符号数整型数右移操作时,标准中并没有说明是逻辑右移还是算术右移,
如果是算术右移,则最高位补充符号位,若是逻辑右移,则最高位填充0,
而对于无符号数,右移时是逻辑右移,即最高位填充0

对于楼主的问题:
0xcffffff3因为是用十六进制表示的整型数,又因为最高位为1,所以编译器为了不损失进度,将0xcffffff3处理为无符号整数,
而对于i,编译器已经知道其类型,楼主的编译器是算术右移,所以最高位被填充符号位
pengzhixi 2011-03-26
  • 打赏
  • 举报
回复
恩 从结果看应该是按补1的方式也就是算术右移了
witwolf 2011-03-26
  • 打赏
  • 举报
回复
int i = 0xcffffff3;
c表示为1100
i的高位为1 显然是负数
printf("%x\n", 0xcffffff3>>2);

0xcffffff3表示为无符号整数
witwolf 2011-03-26
  • 打赏
  • 举报
回复
i本来就是负数

69,371

社区成员

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

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