Cambio de bits en las sumas de control de internet

Es casi seguro que esta es una pregunta muy tonta, pero por alguna razón tengo problemas con los cálculos de la suma de comprobación de Internet. Todos los algoritmos básicamente se parecen a esto:

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;}

Estoy claro en todo excepto en la línea:

sum += (sum >> 16);

Parece que la línea inmediatamente anterior agrega los 16 bits superiores a los 16 bits inferiores, dejando todos los ceros en los 16 bits superiores. Si ese es el caso, ¿entonces la suma >> 16 ahora sería igual a cero? Y si es así, ¿por qué está esa línea allí?

¿O estoy (probablemente) teniendo una falla mental completa hoy?

Respuestas a la pregunta(3)

Su respuesta a la pregunta