在阅读网站上的一些问题时,我遇到了问题需要调试的问题
unsigned int a,b,c; /* a and b are assume to have some values */ c = (a + b) / 2; // <- There is a bug in this st What is the bug? and how you debug it?
一些答案说它可能导致溢出(c =(a b)/ 2).但真的没有得到它如何导致溢出?
解决方法
如果a和/或b非常大,则b可能超过无符号整数的最大大小(请参阅
limits.h
文件中的MAX_UINT).这会导致溢出,结果会出错.例如,如果a和b都等于0x80000000,则结果在32位算术中为0,而不是预期的结果0x80000000.
要解决它,你可以使用这样的东西:
c = a/2 + b/2 + (a % 2 == 1 && b % 2 == 1);
如果您知道b大于a,那么您可以使用这个稍微简单的版本:
c = a + (b - a) / 2;
阅读这篇文章,了解有关这个错误如何在可能流行的语言中出现在二进制搜索算法中的信息(尽管它讨论的是signed int而不是unsigned int):
> Extra,Extra – Read All About It: Nearly All Binary Searches and Mergesorts are Broken