For ARM7, A hardware timer is 32-bits, and unsigned int is 32-bits too; For a 16-bits MCU, A hardware timer is 16-bits, and unsigned int is 16-bits too;
So,
t0 = timer_val; while ( ( timer_val - t0 ) < delay_val );
provide a simple and good delay;
Not so sure about, if a cast is needed.
t0 = timer_val; while ( (unsigned int)( timer_val - t0 ) < delay_val );
Just noticed that, due to the integral promotion,
unsigned short t0, t1; ( t1 - t0 ) is a signed int.
It seems that,
unsigned int t0, t1; ( t1 - t0 ) is still an unsigned int.
I noticed this, because I use unsigned short to present a 16-bits timer_val on my X86-PC for testing/simulating purpose, and the result is not what I expected.
Computations that could lead to an overfow include addition and multiplication.
They include those, yes, but they're not limited to those. But they just as well include subtraction, shifts, unary minus. That's why it says "computation", not "addition", nor "addition and multiplication".
Help me find the place in the standard where it describes the behavior of unsigned integer overflow and underflow during addition and subtraction.
But you already found it! It says there is no such thing as overflow on unsigned arithmetic. How much more clear could that possibly be?