我见过程序员使用这个公式
mid = start + (end - start) / 2
Run Code Online (Sandbox Code Playgroud)
而不是使用更简单的公式
mid = (start + end) / 2
Run Code Online (Sandbox Code Playgroud)
用于查找数组或列表中的中间元素.
他们为什么使用前者呢?
这个问题是另一个SO问题的结果.
示例代码
#include <iostream>
int main()
{
unsigned long b = 35000000;
int i = 100;
int j = 30000000;
unsigned long n = ( i * j ) / b; // #1
unsigned long m = ( 100 * 30000000 ) / b; // #2
std::cout << n << std::endl;
std::cout << m << std::endl;
}
Run Code Online (Sandbox Code Playgroud)
产量
85
85
编译此代码g++ -std=c++11 -Wall -pedantic -O0 -Wextra会发出以下警告:
9:28: warning: integer overflow in expression [-Woverflow]
问题
我是否正确地思考#1 …