摘要:上面代码的结果是,这跟我们希望的结果相反,为什么绝对值函数没有得到正确结果呢,我们来看下源码在的源码中,对于负数直接使用了加上负号来取法,但是我们知道,因为存在,的范围是,所以最小的数加上负号对应的其实超过了对应的最大整数范围。
public class Test { public static void main(String[] args) { int a=Integer.MIN_VALUE; System.out.println(Math.abs(a)); } }
上面代码的结果是true,这跟我们希望的结果相反,为什么绝对值函数没有得到正确结果呢,我们来看下源码
public static int abs(int a) { return (a < 0) ? -a : a; }
在abs的源码中,对于负数直接使用了加上负号来取法,但是我们知道,因为存在0,int的范围是[-2^31,2^31-1],
所以最小的数-2^31加上负号对应的2^31其实超过了int对应的最大整数范围。我们再来从字节的角度分析一下,32位太长了
这里我用1字节意思一下,数字在计算机内用补码表示
127: 0111 1111
-128: 1000 0000
按照加负号的取反过程,回顾一下组原的知识,负数取反是先所有位取反(包括符号为),再+1
也就是0111 111再+1,于是有1000 0000,这样原因和过程就一目了然了
扩展:从上面的字节表示我们还可以看出Integer.MAX_VALUE+1=Integer.MIN_VALUE
文章版权归作者所有,未经允许请勿转载,若此文章存在违规行为,您可以联系管理员删除。
转载请注明本文地址:https://www.ucloud.cn/yun/73220.html
摘要:首先,分析溢出条件,设置符号位,然后取绝对值运算。原理如下,被除数,除数,设等于。如,,,所以商里必定有一个的次方存入,然后。然后被除数减去,继续。此时,,循环结束。再举一个例子看得懂的版本综合一下 Problem Divide two integers without using multiplication, division and mod operator. If it is ...
摘要:位操作法复杂度时间空间思路我们设想,本来应该的得到余,那么如果我们把忽略余数后分解一下,,也就是,也就是把商分解为,所以商的二进制是。我们可以不断的将乘的一次方,二次方,等等,直到找到最大那个次方,在这里是的四次方。 Divide Two Integers Divide two integers without using multiplication, division and m...
Problem Given two integers dividend and divisor, divide two integers without using multiplication, division and mod operator. Return the quotient after dividing dividend by divisor. The integer divisi...
摘要:很容易想到,我们每次用被除数减去除数,进行减法的次数就是最终结果。这道题的采取了一种类似二分查找的思想。除了这些,这道题还要注意一些边界情况的判断,例如除数或被除数为,值溢出等。 题目详情 Divide two integers without using multiplication, division and mod operator.If it is overflow, retu...
摘要:细节上还要考虑正负号和整数位的越界情况。然后在循环内判断,如果有重复出现的,或者中小数部分的长度超过,就说明该小数无法完全转换。如果之前的正负号为,就在左边加上负号。 Problem Given a (decimal - e.g. 3.72) number that is passed in as a string, return the binary representation t...
阅读 2282·2021-10-14 09:42
阅读 1092·2021-09-22 15:09
阅读 3480·2021-09-09 09:33
阅读 2958·2021-09-07 09:59
阅读 3584·2021-09-03 10:34
阅读 3481·2021-07-26 22:01
阅读 2783·2019-08-30 13:06
阅读 1128·2019-08-30 10:48