Why exactly does windows use so many typedefs? Are there any guarantees about these typedefs? IE same size from implementation to implementation? Otherwise some of them seem somewhat redundant, IE CHAR, PCHAR, BYTE, on and on.

I have tried to stick with these typedefs when writing windows apps but I suppose I've never stopped to think and ask, hey why am I doing it this way? Do I gain anything by using a DWORD over unsigned long, etc etc...