左移操作中出现意外输出...?
我读到左移 e1<
e1* 2e2
。
但对于代码:
x=5;
printf("%d",x<<3);
输出是40,但根据我的说法,它应该是30。
对于 x<<4
来说,它是 80 。(但预期是 40)。
尽管对于 x<<1
和 x<<2
输出如预期的那样是 10 和 20。
请解释一下这个逻辑。
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(2)
00000101 = 4 + 1 = 5
00101000 = 32 + 8 = 40
左移不是连续乘以 2, 4, 6, 8(即 x*2),而是连续乘以 2, 4, 8, 16(即 x^ 2)。
00000101 = 4 + 1 = 5
00101000 = 32 + 8 = 40
Left shift is not successive multiplication by 2, 4, 6, 8 (i.e. x*2)—it's successive multiplication by 2, 4, 8, 16 (i.e. x^2).
不,40 是完全正确的...
您似乎期待的是:“x * 2 * n”,但左移是不同的操作。
您可以将左移视为有效的“x * 2^n”,其中 n 是数字 - 在您的情况下为 3。所以您正在做的是 5 * 8,即 40。
相同80:5 * 16,即 80。
No, 40 is quite right...
What you seem to be expecting is this: "x * 2 * n", but left shift is a different operation.
You can think of left shift as an efficient "x * 2^n" where n is the number - in your case 3. So what you're doing is 5 * 8, which is 40.
Same goes for 80: 5 * 16, which is 80.