Integer.valueOf转换负数时抛出NumberFormatException

本文探讨了Java中Integer.parseInt在处理32位负二进制数时抛出NumberFormatException的原因。通过分析源码,指出 parseInt方法通过检查前导符号判断负数,而非依据最高位。当32位且最高位为1的二进制数被误判为正数进行累加时,由于超出正数范围导致异常。解析过程中还涉及防止溢出的处理和负数的表示方式。
摘要由CSDN通过智能技术生成

1. 问题描述

今天在牛客上,有牛友抛出了这样一个问题:


Integer m =Integer.valueOf("11111111111111111111111100000000",2);

上面这段代码,二进制数的长度是32位,没超出Integer的范围,为什么会抛出NumberFormatException的异常呢?

2. 探究

当时我也很好奇,所以就打开IDE,探究了一下源码,以下是过程:
这里写图片描述
下面,先看一下parseInt的注释:
这里写图片描述
注释中说,是通过查看第0个字符是否为’-‘来判定负数,而不是看最高位是否为1。如此一来好像解释的通了。再看一下真正的转换过程(这里我调了一下源码的排版,不然惨不忍睹…):
这里写图片描述
确实如注释中所说,此时,一个32位且最高位为1的二进制数,会被错误的判定为正数。而在下面有这样一行代码:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值