请教个移位操作?高手进++++++++++++++++++++

时间:2021-07-23 18:55:10

unsigned int a = 1610612736; //0110 0000 0000 0000 0000 0000 0000 0000
unsigned int b = a<<1; // 3221225472
//0001 0011 0011 0011 0011 0011 0011 0011


左移一位 应该是  1100 0000 0000 0000 0000 0000 0000 0000 , 但实际上不是,为什么?

这里是左移所以不存在右移的补0还是补1的问题,而且是无符号的

8 个解决方案

#1


>左移一位 应该是  1100 0000 0000 0000 0000 0000 0000 0000 , 但实际上不是,为什么?
因为你算错了

#2


你的二进制是:322122547
正确结果是:3221225472

你仔细眼看有什么不同。。

#3


从哪里看出来的实际上不是?

#4


>左移一位 应该是  1100 0000 0000 0000 0000 0000 0000 0000 , 但实际上不是,为什么?
因为你算错了

#5


引用 1 楼 FancyMouse 的回复:
>左移一位 应该是  1100 0000 0000 0000 0000 0000 0000 0000 , 但实际上不是,为什么?
因为你算错了


引用 3 楼 zhxianbin 的回复:
从哪里看出来的实际上不是?



断点看 b 的值就知道了

#6


关掉编译优化,并且,断点要加到后面一条语句上,b才会被更新。

#7


引用 6 楼 YTerrenceLau 的回复:
关掉编译优化,并且,断点要加到后面一条语句上,b才会被更新。


我是在 debug 下调试的,你试都不试就瞎猜

#8


楼主多半犯傻以为当前行已经被执行过了!

#1


>左移一位 应该是  1100 0000 0000 0000 0000 0000 0000 0000 , 但实际上不是,为什么?
因为你算错了

#2


你的二进制是:322122547
正确结果是:3221225472

你仔细眼看有什么不同。。

#3


从哪里看出来的实际上不是?

#4


>左移一位 应该是  1100 0000 0000 0000 0000 0000 0000 0000 , 但实际上不是,为什么?
因为你算错了

#5


引用 1 楼 FancyMouse 的回复:
>左移一位 应该是  1100 0000 0000 0000 0000 0000 0000 0000 , 但实际上不是,为什么?
因为你算错了


引用 3 楼 zhxianbin 的回复:
从哪里看出来的实际上不是?



断点看 b 的值就知道了

#6


关掉编译优化,并且,断点要加到后面一条语句上,b才会被更新。

#7


引用 6 楼 YTerrenceLau 的回复:
关掉编译优化,并且,断点要加到后面一条语句上,b才会被更新。


我是在 debug 下调试的,你试都不试就瞎猜

#8


楼主多半犯傻以为当前行已经被执行过了!