-5>>2 为什么等于-2 要求详解过程

wangye292 2008-04-07 09:49:25
正常理解为-1 但是编译器结果确实-2 求答案!!

...全文
477 12 打赏 收藏 转发到动态 举报
写回复
用AI写文章
12 条回复
切换为时间正序
请发表友善的回复…
发表回复
danny1221 2008-04-13
  • 打赏
  • 举报
回复
以负数0x80000000为例,右移一位的时候,并不是简单地把最高位的1移到第二位变成0x40000000,而是0xC0000000。这是因为移位前是个负数,仍然要保证移位后是个负数,因此移位后的最高位会设为1。如果一直做右移运算,最终这个数字就会变成0xFFFFFFFF.
int main() 
{
int i = 0x80000000;
for( int k = 0; k < 31; ++k ) {
i >>= 1;
cout << hex << i << endl;
}
}
0黄瓜0 2008-04-08
  • 打赏
  • 举报
回复
这里涉及移位运算时前面是补0还是补1的问题.java用>>和>>>来决定这个问题.C++大概是根据变量的类型.也就是如果对一个有符号数做>>运算,当它是负数时前面补1,以保持它移位以后仍是负数,而不是一下子就变成一个大负数. 但对相同内存bit状态的无符号数做同样的>>运算,前面补0.
#include  <iostream> 

using namespace std;
int main()
{
int x=0xFFFFFFFB;//-5;
unsigned ux=0xFFFFFFFB;//与x的内存bit相同
printf("%X , %d \n",x>>2 , x>>2 ); //FFFFFFFE说明前面补1
printf("%X , %d \n",ux>>2 , ux>>2 );//3FFFFFFE说明前面补0

return 0;
}
Mr__zhang 2008-04-08
  • 打赏
  • 举报
回复
右移“>>”一位相当于除以2
左移“<<”一位相当于乘以2
。。。。。。。。。。。。。。。。。。。。。
记得是这样的,^_^
wangye292 2008-04-08
  • 打赏
  • 举报
回复
在C语言中有算术移位吗?这种算术符 "<<" , ">>"是逻辑移位还是算术移位???
谢谢!

[Quote=引用 3 楼 baihacker 的回复:]
这里假设为8位
5:0000 0101
取反:1111 1010
加1: 1111 1011
上面中-5的内存表示
-5右移为算术右移

0111 1101
1111 1101 移一次(以前最高位是1,算术右移在最高位上加1)
0111 1110
1111 1110 移两次(以前最高位是1,算术右移在最高位上加1)

结果为-2
[/Quote]
ttkk_2007 2008-04-08
  • 打赏
  • 举报
回复
[Quote=引用 9 楼 wangye292 的回复:]
在C语言中有算术移位吗?这种算术符 " < <" , ">>"是逻辑移位还是算术移位???
谢谢!

引用 3 楼 baihacker 的回复:
这里假设为8位
5:0000 0101
取反:1111 1010
加1: 1111 1011
上面中-5的内存表示
-5右移为算术右移

0111 1101
1111 1101 移一次(以前最高位是1,算术右移在最高位上加1)
0111 1110
1111 1110 移两次(以前最高位是1,算术右移在最高位上加1)

结果为-2
[/Quote]
算术移位
kojie_chen 2008-04-07
  • 打赏
  • 举报
回复
移位运算?看不太懂
Mr__zhang 2008-04-07
  • 打赏
  • 举报
回复
我也来学学。。。。^_^
arong1234 2008-04-07
  • 打赏
  • 举报
回复
这其实和代码没啥关系,楼主需要学习的是负二进制数的定义
Walker-cheng 2008-04-07
  • 打赏
  • 举报
回复
自己多写点代码研究下吧
baihacker 2008-04-07
  • 打赏
  • 举报
回复
这里假设为8位
5:0000 0101
取反:1111 1010
加1: 1111 1011
上面中-5的内存表示
-5右移为算术右移

0111 1101
1111 1101 移一次(以前最高位是1,算术右移在最高位上加1)
0111 1110
1111 1110 移两次(以前最高位是1,算术右移在最高位上加1)

结果为-2

zgjxwl 2008-04-07
  • 打赏
  • 举报
回复
我也看看
  • 打赏
  • 举报
回复
FFFFFFFB , -5
FFFFFFFE , -2

int main(int argc,char *argv[])
{
printf("%X , %d \n",-5 , -5 );
printf("%X , %d \n",-5>>2 , -5>>2 );
return 0;
}

70,037

社区成员

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

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