位运算的问题,还没想明白,占个坑,晚上找解答

1<<32的结果是什么?1<<-1的结果又是什么?为什么?

全部评论
首先要把符号左边那个数转换成二进制,然后移动相应的右边那个数的位置。左移,右边补零,右移,左边补零,把右边的多出的数删掉。然后把得到的二进制再转换为十进制,就是结果。
点赞 回复
分享
发布于 2016-11-25 16:08
从结果可以看出C语言左移操作准确的说应该是循环左移操作。如int类型左移(在32位系统上),每个位向左移动,低位补0。到31位移出时,循环到最低位。 右移操作,对unsigned int类型,左边空出的部分用0填补;对int类型,部分机器对左边空出的部分用符号位填补,而另外一些机器用0填补。
点赞 回复
分享
发布于 2016-11-25 17:34
联易融
校招火热招聘中
官网直投
补充一下,1<<-1是错误表达式,移位操作右表达式不能未负。
点赞 回复
分享
发布于 2016-11-25 17:36
https://msdn.microsoft.com/zh-cn/library/336xbhcz.aspx 这个讲解了左移和右移,正数和负数的移位运算规则和例子
点赞 回复
分享
发布于 2016-11-25 17:37
点赞 回复
分享
发布于 2016-11-25 17:45
移位运算中,当移位数量大于字长时,一般其实际移位量为k mod w即使,如1>>32和1>>0结果一样
点赞 回复
分享
发布于 2016-11-25 23:12
陈正冲《C语言深度剖析》中指出,移位操作对移位运算符右边表达式有要求:1.为整数  2.非负  3.不超过字长(否则无意义) ;   最后指出在移位操作只有对无符号整数才有意义,在实际程序中,不应该对有符号数进行移位操作,因为对有符号数移位容易出错(PS:可以这么做,但比较绕,结果往往与我们预想的不一样,所以不提倡有符号数进行异味操作)
点赞 回复
分享
发布于 2016-11-26 09:42
1<<32,32位机子上gcx直接报错, csapp这个有写道 膜运算一下
点赞 回复
分享
发布于 2016-12-02 01:22

相关推荐

点赞 收藏 评论
分享
牛客网
牛客企业服务