二進位制字串轉化為十進位制數字,感覺明明是在範圍內卻報異常了
阿新 • • 發佈:2019-02-11
Integer預設為32位儲存空間,parseInt轉換時保留符號位(也就是需要顯式的輸入"-"去表示負數),則剩下31位,最大表示的16進位制數字為7FFF FFFF,8000 0000 的二進位制為1000 0000 0000 0000 0000 0000 0000 000,不符合轉換規則 因此,16進製表示integer範圍就是 ±7FFF FFFF,你輸入的數字被視為﹢8000 0000,超出範圍,丟擲NumberFormatException,不冤枉
</pre><pre id="best-content-1226739221" class="best-text mb-10" name="code" style="white-space: pre-wrap; word-wrap: break-word; margin-top: 0px; margin-bottom: 10px; padding: 0px; font-family: arial, 'courier new', courier, 宋體, monospace;">
原來是parseInt這個函式自己在轉化的時候轉化的範圍並不是我們以為的那樣,比如轉化為int但是輸入引數範圍並不能是int的最大值。
為此做了一個測試
<p class="p1"> <span style="white-space: pre;"> </span><span class="s1">int</span> f = -2147483648;</p><p class="p1"> System.<span class="s2">out</span>.println(Integer.toBinaryString(f));</p><p class="p1"> System.<span class="s2">out</span>.println(Integer.parseInt(Integer.toBinaryString(f),2));</p><p class="p1">結果為</p><p class="p1"></p><p class="p1">10000000000000000000000000000000</p><p class="p2">Exception in thread "main" <span class="s1">java.lang.NumberFormatException</span>: For input string: "10000000000000000000000000000000"</p><p class="p2"> at java.lang.NumberFormatException.forInputString(<span class="s1">NumberFormatException.java:48</span>)</p><p class="p2"> at java.lang.Integer.parseInt(<span class="s1">Integer.java:461</span>)</p><p class="p2"> at NumberTest.main(<span class="s1">NumberTest.java:91</span>)</p> <p class="p1">可見這是parseInt這個函式的問題,所以只好用更大的資料型別long來進行轉化了</p>