����Ϻ����Ȥ���ͳ�ǡ�

Official Google Research Blog: Extra, Extra - Read All About It: Nearly All Binary Searches and Mergesorts are Broken
The bug is in this line:
 6:             int mid =(low + high) / 2;

�ʤ�Ȥ������ޤʥХ���

��ŵŪ�Х��ʥꥵ�������르�ꥺ��˥Х�: �ۥåȥ����ʡ�������΢
���̤��������ˤʤ�ʤ���Ǥ������ޤΤۤȤ�ɤΥޥ���ϡ�int��32bit�����顢���Υ��르�ꥺ��ǡ�2 ^ 31 - 1�Ȥ���int�κ����ͤ�Ķ����褦�� ���ȤϤʤ����顣

����äȰ㤤�ޤ���n >= (MAX_INT/2 + 1)��n�ʤ�ȯ�����ޤ��衣

�����ǡ�MAX_INT�� 0x7FFFFFFF������Ⱦʬ+1��0x40000000���Ȥ������Ȥ�low = high = 0x40000000 �λ���low + high = 0x80000000���Ȥ����������-0x40000000�����ʤ�� -1073741824 �Ȥ������Ȥˤʤ�ޤ���

�����ͻҤϡ��ʲ��ǺƸ����뤳�Ȥ�����ޤ���

#include <stdio.h>
int main (int argc, char **argv){
    signed int mid;
    signed int high = 0x40000000;
    signed int low  = 0x40000000;
    mid = (high + low) / 2;
    printf("%d\n", mid);
}

32bit platform�ʤ�ִ����̤�ס�-1073741824�Ȥ����������Ф�Ϥ��Ǥ���

�������������1GB���Τ��ˤ���������礭���������bsearch������sort������Ȥ��������Ϥ��ޤ�ʤ������Ǥ��������Ū�ȶ����Ǥ�suffix array�Ȥ������Υ������ˤ֤������ꤽ���Ǥ���

���ʤߤˡ����򥳡��ɤϰʲ��Τ褦�ʴ����ˤʤ�ޤ�����

int mid(int low, int high){ /* macro �Ǥ⤤��? */
    return low + ((high - low) / 2);
}

�ϡ��ɥ������οʲ������եȥ������ΥХ���ʤ�������Ƥ��ޤä��Ȥ��������������������Τ�ޤ���͡�

Dan the Man with Too Many Bits to Crunch

�ɵ�:�����褯�������縵��Joshua Bloch�ΤȤ����ˤ�ܤäƤ�fix���ʡ����졣�󤸤���ȿ§���ǡ�

int mid(int low, int high){
    return (int)(((double)high + (double)low)/2);
}