x * x >= 0 一定成立吗?

https://mp.weixin.qq.com/s/GKyr0PuePPrYskHN6uUU6w

对于大多数编程语言,当 46341 <= int x <= 65535 时,x 的平方结果会是负数 。

其实,这确实是个问题,C 语言的处理方式是,-int_min 仍然等于 int_min所以说负数的相反数不一定是正数哦,int_min 是唯一一个特例。

避免溢出:

还有一个常见的防止溢出的技巧,在二分查找算法中就有用到,我们看一下二分查找算法:

 

int binarySearch(int[] nums, int val) {
    int lo = 0, hi = nums.length - 1;
    while (lo < hi) {
        // int mid = (lo + hi) / 2;
        int mid = lo + (hi - lo) / 2;
        // ...
    }
}

 

计算 int mid 变量时,为了防止 lo 和 hi 变量数值太大,导致 (lo + hi) 溢出得到负数,我们巧妙地避免了直接相加,仍然得到了相同的结果,这是二分查找算法的一个细节,值得学习。

你可能感兴趣的:(C++)