爲什麼這個代碼拋出NumberFormatException
:的Java,Long.parse二進制字符串
String binStr = "1000000000000000000000000000000000000000000000000000000000000000";
System.out.println(binStr.length());// = 64
System.out.println(Long.parseLong(binStr, 2));
爲什麼這個代碼拋出NumberFormatException
:的Java,Long.parse二進制字符串
String binStr = "1000000000000000000000000000000000000000000000000000000000000000";
System.out.println(binStr.length());// = 64
System.out.println(Long.parseLong(binStr, 2));
1000000000000000000000000000000000000000000000000000000000000000
比
Long.MAX_VALUE
大。
見https://stackoverflow.com/a/8888969/597657
考慮使用BigInteger(String val, int radix)
代替。
編輯:
OK,這是新的我。看起來Integer.parseInt(binaryIntegerString, 2)
和Long.parseLong(binaryLongString, 2)
解析二進制爲符號量級而不是二進制補碼。
你錯過了我第一次評論時錯過的內容;)它不是*更大* ......它不存在。 – 2013-02-17 22:55:04
'String binStr =「1000000000000000000000000000000000000000000000000000000000000000」; 的System.out.println(binStr.length()); // = 64 的System.out.println(的Long.parseLong(binStr,2));' – 2013-02-17 22:58:56
即鏈接答案是錯誤的,爪哇表示整數作爲二進制補碼內部,而不是數量級。 – 2013-02-17 23:38:55
因爲它超出範圍。 1000...000
是2 ,但Long
只上升到2 - 1
你錯過了什麼,我錯過了,當我第一次評論;)這不是* *更大,它不存在。 – 2013-02-17 22:53:29
所以,畢竟我們的討論中,*應*是'來自位圖形Long.MIN_VALUE',但'parseLong'不喜歡這一點。每天學些新東西 :) – 2013-02-18 00:13:10
最大的長期價值居然是:
0111111111111111111111111111111111111111111111111111111111111111b = 9223372036854775807
這是對所有的Long
,Integer
,Short
和相同Byte
。因爲它是可讀的,我會用Byte
例子來說明:
System.out.println(Byte.MIN_VALUE); // -128
System.out.println(Byte.MAX_VALUE); // 127
String positive = "1000000"; // 8 binary digits, +128
String negative = "-1000000"; // 8 binary digits, -128
String plus = "+1000000"; // 8 binary digits, +128
Byte.parseByte(positive, 2); //will fail because it's bigger than Byte.MAX_VALUE
Byte.parseByte(negative, 2); //won't fail. It will return Byte.MIN_VALUE
Byte.parseByte(plus, 2); //will fail because its bigger than Byte.MAX_VALUE
的數字解釋無符號,不管提供了什麼基數。如果你想要一個負值,你必須在字符串的開頭有減號。 JavaDoc說:
將字符串參數解析爲以 第二個參數指定的基數long long。字符串中的字符必須全部爲指定基數的數字 (由
Character.digit(char, int)
返回非負值決定),除了第一個字符可能是 是ASCII減號'-' ('\u002D')
以指示負值或 ASCII加號'+' ('\u002B')
表示正值。 生成的long值被返回。
爲了獲得MAX_VALUE
我們需要:
String max = "1111111"; // 7 binary digits, +127
// or
String max2 = "+1111111"; // 7 binary digits, +127
這是因爲的Long.parseLong無法解析二進制補碼錶示。解析在Java SE二進制補碼字符串表示的唯一方法是BigInteger的:
long l = new BigInteger("1000000000000000000000000000000000000000000000000000000000000000", 2).longValue()
這給預期-9223372036854775808result
這是最大的可能長(9223372036854775807 = 2 EXP 63 - 1)以二進制格式。注意最後一位數字末尾的L.
long largestLong = 0B0111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111_1111L;
重讀這一點,它實際上是一個很好的問題。 – 2013-02-17 22:52:37
+1好問題。 – 2013-02-17 23:55:48
這可能是一個有趣的* *的問題,但肯定不是一個[*良好*問題(http://meta.stackexchange.com/questions/156810/stack-overflow-question-checklist)。 – Jeroen 2013-02-18 00:12:51