今天遇到一个很奇怪的问题,求大神解答

Integer m =Integer.valueOf("11111111111111111111111100000000",2);这一句代码会抛出Exception in thread "main" java.lang.NumberFormatException异常,也就是说格式异常。
首先,语言是java的,我是想把一个32为ip转为整数,式子中1和0刚好有32位,按道理来说应该不会抛出异常才对,但是不知道为什么抛出了。另外,如果减少一位,也就是减少末尾一个0,变为31位,却不会抛出异常,如果使用Long.valueOf()也不会抛出异常。所以很奇怪,各位帮解析一下吗?
全部评论
最简单的办法就是看源码。 先来看一下parseInt的注释: 注释中说,是通过查看第0个字符是否为'-'来判定负数,而不是看最高位是否为1。如此一来好像解释的通了。再看一下真正的转换过程(这里我调了一下源码的排版,不然惨不忍睹...): 确实如注释中所说,此时,一个32位且最高位为1的二进制数,会被错误的判定为正数。而在下面有这样一行代码: 可以看到,一个32位且最高位为1的二进制数,会被累加32次,所以其累加和是超过Integer正数的范围的。实际上不用等到第二个红框位置,在if(reult<multmin)时,就已经抛出异常了。multmin我觉得为了防止result*radix后溢出而设置的。代码的运行结果也印证了这个推测: 另外,result每次是加上负的digit,这是因为Integer的表示范围是-2的32次方到2的32次方-1.正数的值要小,那么在计算一个负数时,如果遵循先正向累加再求负的过程,是有可能溢出的。最终的结果输出可以很明显的看到是result是负数:
点赞 回复 分享
发布于 2016-09-09 09:59
    int 或者Integer所能接受的二进制数位数是1个符号位位+31个数值位,Integer.valueOf不依靠符号位判断正负,而是字符串中的+/-,所以传递的字符串中二进制数最多只能是31位。这一点最好的验证就是,对于1000...000(31个0),Integer.ValueOf无法表示出 -2^31。     你可以使用Long.valueOf(),再把结果强制转换成int,它会自动截取的,可以达到你想要的结果。
点赞 回复 分享
发布于 2016-09-09 11:09
你看一下该方法的源码就知道了。 源码中,会把字符串的第一位,当做符号位,而且符号位只能是+-,即加减号,而不是1或0。 如果第一位不是加减号,则会把整个字符串当做正整数转换,这时候32位就超过int的表示范围了。因为int共32位,最高位是符号位,即纯数字值只有31位。
点赞 回复 分享
发布于 2016-09-09 09:53
因为有正负呀
点赞 回复 分享
发布于 2016-09-09 00:10

相关推荐

2025-12-08 07:42
门头沟学院 Java
27届末九,由于是女生,身边人几乎没有就业导向的,自学只能跟着网课,没人指导,很迷茫。下图是我目前的简历,不知道有需要修改的地方吗?求拷打。下面是目前的学习情况:目前算法过完了一遍力扣100和代码随想录,不过不是很熟,面经看了小林coding、JavaGuide,有一些没用过的技术看得不是很明白,掌握得不是很扎实。再加上常年跟黑马网课听思路,真正自己动手写代码的时间很少,这让我一直不敢投简历,总觉得内里空虚。项目没准备好面试相关的问题,简历上相应的考点不熟。如此种种。。。看到很多很多学长学姐大佬们的面经,愈发觉得面试可怕,自己没准备好,总担心自己是不是无望后端开发了。看到牛客很多同届以及更小一届的同学都找到实习了,很希望自己也能找到实习。而自己又好像摸不到后端学习的门路,只能不断赞叹黑马虎哥写的代码真优雅!微服务架构实在巧妙!消息队列、redis、sentinel、nacos、mybatisplus等等的引入都会让我赞叹这些工具的设计者的巧思,以及包括但不限于Java语言的优雅。然而只是停留在了解的程度,并不熟练。我是很希望能够继续深入探索这些知识的,只不过有一大部分时间都花在学校课程上了。我感觉我被困住了,我一方面必须保证我能够有个不错的学业分使我能有我几乎不想选择的读研退路(还有个原因是复习不全我会焦虑考试挂科,因此我会做好全面的准备,而这一步很费时间),一方面在B站学习各种网课,一方面得考虑提升自己并不扎实的算法基础,另一方面还得准备八股面经。这让我有点苦恼,我好像没那么多时间,因为绝大部分时间都花在了复习学校科目中了。我好像处处用时间,但收效甚微。想问问各位大佬是怎么平衡时间的呢?算法、项目和八股是怎么准备的呢?有什么高效的方法吗?谢谢您们花时间阅读我的稿件!
菜菜狗🐶:大胆投,我当时也是害怕面试,投多了发现根本约不到面🤡
点赞 评论 收藏
分享
牛至超人:哈工大已经很棒了,不需要加括号了,然后咋没有实习经历呢?火速趁寒假整一段实习,导师不让就狠狠肘击
投了多少份简历才上岸
点赞 评论 收藏
分享
评论
点赞
收藏
分享

创作者周榜

更多
牛客网
牛客网在线编程
牛客网题解
牛客企业服务