Bitwise
Byte Checksum
A tiny checksum can combine byte values with masking to keep the result in range.
byte mask
`& 255` keeps only the lowest eight bits of a running total.
bounded sum
Masking after each addition prevents the checksum from growing without bound.
Byte Checksum
byte_checksum.c
Replay: real traced execution (multi-file project)
#include <stdio.h>
int main(void) {
int extra = 4;
unsigned int bytes[3] = {10, 20, (unsigned int)extra};
unsigned int checksum = 0;
for (int i = 0; i < 3; i++) {
checksum = (checksum + bytes[i]) & 255;
}
printf("checksum=%u\n", checksum);
return 0;
}
#include <stdio.h>
int main(void) {
int extra = 40;
unsigned int bytes[3] = {10, 20, (unsigned int)extra};
unsigned int checksum = 0;
for (int i = 0; i < 3; i++) {
checksum = (checksum + bytes[i]) & 255;
}
printf("checksum=%u\n", checksum);
return 0;
}
#include <stdio.h>
int main(void) {
int extra = 200;
unsigned int bytes[3] = {10, 20, (unsigned int)extra};
unsigned int checksum = 0;
for (int i = 0; i < 3; i++) {
checksum = (checksum + bytes[i]) & 255;
}
printf("checksum=%u\n", checksum);
return 0;
}
extra ← 4, bytes ← ⟨addr A⟩, checksum ← 0
3int main(void) {4 int extra→ 4 = 4; //@extra=40, 2005 unsigned int bytes→ ⟨addr A⟩[3] = {10, 20, (unsigned int)extra4};6 unsigned int checksum→ 0 = 0;checksum ← 10
pass 1 of 38for (int i0 = 0; i < 3; i++) {9 checksum→ 10 = (checksum + bytes[i]10) & 255;10}All 3 passes — pass 1 is the card above pass ibytes[i]checksum1 0 10 0 → 10 2 1 20 10 → 30 3 2 4 30 → 34 printf("checksum=%u ", checksum);
12 printf("checksum=%u\n", checksum34);13 return 0;14}outputchecksum=34
extra ← 40, bytes ← ⟨addr A⟩, checksum ← 0
3int main(void) {4 int extra→ 40 = 40;5 unsigned int bytes→ ⟨addr A⟩[3] = {10, 20, (unsigned int)extra40};6 unsigned int checksum→ 0 = 0;checksum ← 10
pass 1 of 38for (int i0 = 0; i < 3; i++) {9 checksum→ 10 = (checksum + bytes[i]10) & 255;10}All 3 passes — pass 1 is the card above pass ibytes[i]checksum1 0 10 0 → 10 2 1 20 10 → 30 3 2 40 30 → 70 printf("checksum=%u ", checksum);
12 printf("checksum=%u\n", checksum70);13 return 0;14}outputchecksum=70
extra ← 200, bytes ← ⟨addr A⟩, checksum ← 0
3int main(void) {4 int extra→ 200 = 200;5 unsigned int bytes→ ⟨addr A⟩[3] = {10, 20, (unsigned int)extra200};6 unsigned int checksum→ 0 = 0;checksum ← 10
pass 1 of 38for (int i0 = 0; i < 3; i++) {9 checksum→ 10 = (checksum + bytes[i]10) & 255;10}All 3 passes — pass 1 is the card above pass ibytes[i]checksum1 0 10 0 → 10 2 1 20 10 → 30 3 2 200 30 → 230 printf("checksum=%u ", checksum);
12 printf("checksum=%u\n", checksum230);13 return 0;14}outputchecksum=230