Mudança de bit nas somas de verificação da internet
Esta é quase certamente uma pergunta muito boba, mas por alguma razão eu estou tendo problemas com cálculos de soma de verificação de internet. Todos os algoritmos basicamente se parecem com isso:
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;}
Estou claro em tudo, exceto pela linha:
sum += (sum >> 16);
Parece a linha imediatamente antes de adicionar os 16 bits de cima aos 16 bits de baixo, deixando todos os zeros nos 16 bits de cima. Se for esse o caso, então não seria >> 16 agora igual a zero? E se sim, por que essa linha está aí?
Ou estou (provavelmente) tendo apenas uma falha mental completa hoje?