这几乎可以肯定是一个非常愚蠢的问题,但由于某种原因,我在互联网校验和计算方面遇到了麻烦。所有的算法基本上都是这样的:
WORD chksm(WORD *startpos, WORD checklen){
ulong sum = 0;
WORD answer = 0;
while (checklen > 1)
{
sum += *startpos++;
checklen -= 2;
}
if (checklen == 1)
{
*(BYTE *)(&answer) = *(BYTE *)startpos;
sum += answer;
}
sum = (sum >> 16) + (sum & 0xffff);
sum += (sum >> 16);
answer = ~sum;
return answer;}
除了这条线,我什么都清楚:
sum += (sum >> 16);
它看起来就像在将前 16 位添加到后 16 位之前的行,在前 16 位中留下全零。如果是这种情况,那么 sum >> 16 现在不会等于零吗?如果是这样,为什么那条线在那里?
还是我(很可能)今天完全精神失常?