为什么Java使用这个长二进制数来使用Long.parseLong(String s,int radix)会冒犯?

kun*_*foo 7 java

我有以下代码:

为什么Java认为这不是有效的long.

@Test
public void testOffendingBinaryString() {
  String offendingString = "1000000000000000000010101000000000000000000000000000000000000000";
  assertEquals(64, offendingString.length());
  Long.parseLong(offendingString, 2);
}
Run Code Online (Sandbox Code Playgroud)

Omn*_*ous 5

因为它超出了long的有效值范围.字符串:

"-111111111111111111101011000000000000000000000000000000000000000"
Run Code Online (Sandbox Code Playgroud)

应该工作得很好.您不能直接以2s补码二进制表示法指定负数.如果你试图指定一个正数,那么这个数字太大而不适合Java long,这是一个以2s补码表示的带符号的64位值(这意味着它基本上是63位+一个符号位(它是一个比这更复杂,阅读2s页面上的补充)).