BAT面试必问:a-b<0与a<b什么区别?overflow-conscious代码什么玩意?
读过JDK源码的同学,尤其是读过Collection框架的同学,肯定遇到过下面这种代码:
第一次读到这样的代码,你可能跟我一样感到困惑,为什么不直接写成 “newCapacity < minCapacity”,而是更麻烦的"newCapacity – minCapacity < 0"呢?
不过,当看到那个注释"overflow-conscious code"之后,你或许明白了一点点,这是为了解决数值溢出问题。
那么"newCapacity < minCapacity"中究竟有什么样的溢出问题?"newCapacity – minCapacity < 0"是怎么解决"newCapacity < minCapacity"中的溢出问题的?究竟是newCapacity和minCapacity中的哪个变量溢出?还是两个变量都溢出?对于这些问题,你都能给出清晰的回答吗?如果不能,欢迎继续阅读!
本文以下面这段代码为例,帮助大家彻底弄明白a<b与a-b<0有何区别的问题。在后面的分析中,我们假设入参a和b都大于0,没有溢出;calc1和calc2是两个计算函数,会返回一个比原来更大的数值,而且可能溢出(例如乘以2、向左移位等)
首先,上面代