[转]C 位操作 左移32位 错误

搬砖拼接64位数字,因高32位long未先强转64,导致拼接失败,顺便发现个问题,32位变量左移32位等于原数值。C下位移操作为逻辑位移,全部左移补零后,数值应为零,结果和预期不符,遂查找症结所在。

代码如下:

long i = 512; i = i << 32; 结果i == 512

作为对比:32次i << 1结果是0

short i = 512; i = i << 16; 结果i == 0

所以,第一种情况是个特例。

汇编代码上,shl    20h,shl 1,都是shl

经过一系列对比发现:

初始值512不是重点,初始其他值也是一样效果。;

short 左移32也会出问题,char左移32也会出问题,而二者左移对应的16位和8位都不会有问题,所以问题出在左移32?????!!!!(除了64位的long long ,左移32位才不是原数字,64位是)

GCC编译测试

警告:<<操作达到或者超过类型大小

这个warning也很诡异,针对的不是操作数的类型,还是32位。

例如,long 左移32,会提示这个,short左移16,不会提示。

网上资料

基本都是根据结果猜答案的,类型大小模运算都出来了,那你照顾过16位数的感受吗?16位数左移17位为什么不等于左移1位??(后来仔细看了这段,吐槽一下,自己说了不确定其他编译器,然后还下了定论。)

虽然和我的实操结果相同,但是这种拿经验倒推理论的说法还是不敢太认同。所以去查了一下。

英文版资料如下:

类型强转,这也解释了char和short都只有左移32才异常!!!!!!!即使我用(char)i << 32也是徒劳!!!

原文是说你左移超过32这种操作未定义,也就是说,不支持,不确定,可能因你用的编译器不同而不同!既然答案如此,没办法,只能尽量避免这种操作了!!!!

英文资料摘自https://msdn.microsoft.com/en-us/library/336xbhcz.aspx

---------------------
作者:秦伟H
来源:CSDN
原文:https://blog.csdn.net/huqinweI987/article/details/70941199?spm=1001.2101.3001.6650.13&utm_medium=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-13-70941199-blog-86352134.pc_relevant_default&depth_1-utm_source=distribute.pc_relevant.none-task-blog-2%7Edefault%7EBlogCommendFromBaidu%7Edefault-13-70941199-blog-86352134.pc_relevant_default&utm_relevant_index=16
版权声明:本文为作者原创文章,转载请附上博文链接!
内容解析By:CSDN,CNBLOG博客文章一键转载插件

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值