System.out.println((-1<<31));
为什么这会给出输出-2147483648
我知道-1&lt;&lt;&lt; 31将给出10000000000000000000000000000000,所以它应该给ans (int)Math.pow(2,31)
等于2147483648
答案 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)