1. 问题描述
今天在牛客上,有牛友抛出了这样一个问题:
Integer m =Integer.valueOf("11111111111111111111111100000000",2);
上面这段代码,二进制数的长度是32位,没超出Integer的范围,为什么会抛出NumberFormatException
的异常呢?
2. 探究
当时我也很好奇,所以就打开IDE,探究了一下源码,以下是过程:
下面,先看一下parseInt的注释:
注释中说,是通过查看第0个字符是否为’-‘来判定负数,而不是看最高位是否为1。如此一来好像解释的通了。再看一下真正的转换过程(这里我调了一下源码的排版,不然惨不忍睹…):
确实如注释中所说,此时,一个32位且最高位为1的二进制数,会被错误的判定为正数。而在下面有这样一行代码: