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?

questionAnswers(3)

yourAnswerToTheQuestion