"volatile": the compiler assumes that at any given point in time, the variable could have changed, whether or not it has a reason to believe it has. If you read from the variable twice, or write to the variable twice, the compiler will always actually execute two individual reads or writes, rather than trusting that the value it already has is good.
Used for variables that are shared between threads (where thread B could have modified it in between two reads by thread A), variables that are shared with an interrupt handler (same thing, but replace "thread B" with "interrupt handler"), and variables that represent memory-mapped hardware in a microcontroller (since the variable isn't actually a memory location, there's no guarantee it will behave like memory).
And yeah, the sizes of the variable types is not well defined. Depends on the implementation. If you need reliable integer types, I suggest
stdint.h