为什么右移运算符对于负数会给出意想不到的结果? [重复]

问题描述 投票:0回答:1

我试图了解 JavaScript 中右移 (>>) 运算符的工作原理,尤其是在处理负数时。我知道左移运算符 (<<) effectively multiplies the number by powers of 2. For example:

  • 12 << 1
    给出
    24
    (相当于
    12 * 2
    )。
  • 12 << 3
    给出
    96
    (相当于
    12 * 2 * 2 * 2
    )。
  • 类似地,
    -12 << 3
    给出
    -96

但是当涉及到右移运算符时,我遇到了一些意想不到的结果。我知道右移会将数字除以 2:

12 >> 1
给出
6
,这是有道理的。 但是当我用负数尝试时:

-27 >> 1
给出了
-14
,但我期待着
-13

关于右移如何处理负数,我是否遗漏了什么?

c++ c bit-manipulation bitwise-operators bit-shift
1个回答
0
投票

因为你用的是带符号的2的补码来表示负数

27 在有符号 2 的补码中是 0000000000011011,假设您使用的是 16 位,如果您应用 27>>1,您将得到 0000000000001101,即 13

-27 在有符号 2 的补码中是 1111111111100101,如果你应用 -27>>1,你会得到 1111111111110010,即 -14(最左边的位将始终是 1,因为它是负数)

© www.soinside.com 2019 - 2024. All rights reserved.