您的位置:首页 > 产品设计 > UI/UE

关于FindBug-Bad attempt to compute absolute value of signed random integer

2018-03-20 19:41 1596 查看
遇到的findbug说明:
BUG:Bad attempt to compute absolute value of signed random integer直译:一次坏的尝试——计算一个带有符号的整型数的绝对值。
刚看到很是蒙圈,不知道是什么意思。加个绝对值而已,怎么了吗?
详细描述:This code generates a random signed integer and then computes the absolute value of that random integer.
If the number returned by the random number generator is Integer.MIN_VALUE, then the result will be negative as well
(since Math.abs(Integer.MIN_VALUE) == Integer.MIN_VALUE). (Same problem arises for long values as well).
看到最后一句,Math.abs(Integer.MIN_VALUE)=Integer.MIN_VALUE,意思是当遇到Integerde 最小值时,加上绝对值还是它本身。当时很是奇怪,这是什么原因。
其实很容易,计算机数字表示是二进制的,java中Integer是四个字节大小,也就是32位。其最小值为-2147483648,二进制表示:10000000  00000000  00000000  00000000,正数在计算机中保存为二进制很好理解。但是负数的表示和正数有所差异,负数表示:该数字的补码(补码就是原码的反码再加1)。所以,| -2147483648 | = 2147483648,然而Integer最大表示的数字是2147483647,二进制为:01111111  11111111  11111111  11111111,再加1,就等于2147483648,对应的二进制数
就变为 10000000  00000000  00000000  00000000,这个二进制数,表示的就是Integer.MIN_VALUE。那么,我们将Integer.MIN_VALUE加绝对值,也就是乘以-1,对应的二进制数的操作:
                取反 ---> 加1: 
取反:10000000  00000000  00000000  00000000 -------> 01111111  11111111  11111111  11111111;

加1:10000000  00000000  00000000  00000000。计算后就又变回他本身了。所以计算Integer.MIN_VALUE的绝对值是无法成功的。(当然,Long型也是同样的道理)
其实就是内存溢出导致的绝对值无法把Integer最小值计算为正数。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐