On ne teste pas ici le crc de chaque variable de config, mais le crc de toute la structure.
Mes cours sur le CRC sont loin, mais ce qui est fait ici, c'est un calcul de crc sur chaque valeur de la config (et non sur l'objet "config"), qui contient elle-même une "sauvegarde" du crc. On fait donc un calcul de crc sur l'ensemble "config.* + config.crc", donc le résultat du modulo devrait être 0. Si le crc déjà calculé lors de la sauvegarde n'était pas stocké dans l'objet config, ça ne fonctionnerait pas pareil et on ferait une comparaison config.crc et crc.
Par contre, l'extrait de code à été simplifié ? Parce que je n'y vois pas l'initialisation de crc avant la boucle.
Sinon, pour simplifier la compréhension, le code dans la boucle aurait pu resembler à ça:
ancienCRC = crc;
crc = crc16Update(ancienCRC, data);