我试图了解byte
数组的二进制搜索错误,我理解在计算mid
索引时出现溢出的概念。但是,当我使用byte
数组模拟相同的行为时,如下所示:
public byte binarySearch(byte[] arr, byte low, byte high, byte value){
if(low>high){
return -1;
}
/* Line 1 */ byte overflow_mid = (byte) (((byte) (low + high))/2); // This line giving overflow behaviour
/* Line 2 */ byte mid = (byte) ((low + high)/2); // however this line doesn't, which is not what i expected
if(arr[mid]== value){
return mid;
}
if(arr[mid]>value){
return binarySearch(arr, low, (byte) (mid-1), value);
}
return binarySearch(arr, mid, high, value);
}
我的直觉:
由于低和高变量的类型为byte
,我相信在计算中间索引时,它不需要再次显式转换为byte
2。
由于
答案 0 :(得分:2)
让我们说byte low = 50, high = 100
。
表达式low + high
将首先将两者都提升为int
,然后添加它们,从而产生值150 (int)
。
在版本1中,您然后将150 (int)
投射到byte
,其值为-106 (byte)
。 <强>溢出即可。与+
相同,/
运算符会将双方都提升为int
,因此它变为-106 (int)
,除以-53 (int)
时为2
}。最后,您再次投放到byte
,最后得到-53 (byte)
。
在版本2中,您将150 (int)
除以2
,并且由于双方都已经int
个值,因此不会进行任何宣传,最后是75 (int)
。将其投放到byte
会给您75 (byte)
。 没有溢出。
答案 1 :(得分:1)
你正在施展两个非常不同的价值观。
在第一行中,你要进行两次演员表演。第一个溢出。您将low + high
的结果转换为字节,在您的情况下溢出。
但是,在您的第二行中,您将(low + high) / 2
投射到byte
,并假设low
和high
都是正数,这意味着结果{{1 }}必须是r
,因为low < r < high
和low
都可以用high
变量表示,因此结果byte
和那里&#39 ; s没有溢出。