簡體   English   中英

為什么Java使用這個長二進制數來使用Long.parseLong(String s,int radix)會冒犯?

[英]Why is Java offended by my use of Long.parseLong(String s, int radix) with this long binary number?

我有以下代碼:

為什么Java認為這不是一個有效的long

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

因為它超出了long的有效值范圍。 字符串:

"-111111111111111111101011000000000000000000000000000000000000000"

應該工作得很好。 您不能直接以2s補碼二進制表示法指定負數。 如果你試圖指定一個正數,那么這個數字太大而不適合Java long,這是一個以2s補碼表示的帶符號的64位值(這意味着它基本上是63位+一個符號位(它是一個比這更復雜,閱讀2s頁面上的補充))。

這是Java中的一個錯誤,請參閱http://bugs.sun.com/bugdatabase/view_bug.do?bug_id=4215269 ,他們將其修復為1.8

long存儲在2的補碼中,但解析方法需要直接二進制。 因此, String的最大位數可以是63。

使用常規二進制時,沒有符號位。 您可以傳遞一個長度為63的String ,並在其前面加上-如果您想要一個負long

Java long類型:

簽名8個字節(二進制補碼)。 范圍從-9,223,372,036,854,775,808到+9,223,372,036,854,775,807。

字符串的大小太長,請檢查此問題

內部數字使用二進制補碼表示 這意味着只有63位,數字和一位代表正數或負數。 由於Long.parseLong()不能解析二進制補碼中的數字,因此String是64位的正數,超過了long的最大正值。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM