Timer using millis()

Dyslexicbloke:
They are the same size but the signed version is 50% negative.

And 50% positive. The values are offset by half the total range...

unsigned: 0 to 65535 (the range is 65536 so half of that is 32768)

int: (0-32768) to (65535-32768) or -32768 to +32767

(Possibly not the best way to phrase that, there must be a proper way)

Use whatever phrasing you can remember.

Why doesn't it work for bytes? or chars for that matter, which are signed bytes arn't they?

I believe char's signage can be positive or negative depending on the compiler and the defaults. In the Arduino / AVR world it is signed.

Anything smaller than an int (or unsigned) is "sign extended" to an int (or unsigned) before any operations are applied. A byte becomes unsigned. A char becomes int. That is probably why the expressions are not working the way you expect.