-1左移31

时间:2015-07-06 05:34:58

标签: java bit-manipulation

System.out.println((-1<<31));

为什么这会给出输出-2147483648

我知道-1&lt;&lt;&lt; 31将给出10000000000000000000000000000000,所以它应该给ans (int)Math.pow(2,31)等于2147483648

3 个答案:

答案 0 :(得分:7)

-1<<31提供的10000000000000000000000000000000-2147483648,而不是2147483648。请注意,左边的位是符号位,所以如果它是1,则为负数。

顺便说一句,1<<31也会给你-2147483648,因为2147483648高于Integer.MAX_VALUE。另一方面,1L<<31会为您2147483648,因为结果为long

答案 1 :(得分:4)

  

我知道-1&lt;&lt;&lt; 31将给出100000000000000000,所以它应该给ans(int)Math.pow(2,31)等于2147483648

如果int是二元补码无符号原语,那就是这种情况;但int已签名。

你是正确的,在二进制中这确实给你所说的;但是,因为这是带符号的二元补码原语,结果将是x(0)* 2 ^ 0 + x(1)* 2 ^ 1 + ... + x(n-2)* 2 ^(n-2 ) - x(n-1)* 2 ^(n-1)(减去,不是加号),其中x(y)是第y位的值,从0开始计数。

因此你的结果。

答案 2 :(得分:3)

如今在大多数架构中,数字都存储在2个补码中,请参阅Wikipedia

所以你的结果是正确的。符号位已设置且所有静止零(因为2补码)使得该数据类型的负数最多,请参阅here

以2补语思考

-1 is represented by 1111 1111 1111 1111 1111 1111 1111 1111

左移31次产生

1000 0000 0000 0000 0000 0000 0000 0000 which represents -2.147.483.648