左移操作中出现意外输出...?

发布于 2024-09-28 22:24:58 字数 421 浏览 6 评论 0 原文

我读到左移 e1< 相当于 e1* 2e2。 但对于代码:

x=5;
printf("%d",x<<3);

输出是40,但根据我的说法,它应该是30。 对于 x<<4 来说,它是 80 。(但预期是 40)。

尽管对于 x<<1x<<2 输出如预期的那样是 1020

请解释一下这个逻辑。

I read that Left shift e1<<e2 is equivalent to e1* 2e2.
But for the code:

x=5;
printf("%d",x<<3);

Output is 40 but according to me it should be 30.
and for x<<4 it is 80 .(but expected 40).

Although for x<<1 and x<<2 outputs are 10 and 20 as expected.

Please explain this logic.

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

相权↑美人 2024-10-05 22:24:58

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).

怕倦 2024-10-05 22:24:58

不,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.

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文