Because on 32 bit its unsigned long int, on 64 bit its unsigned long long (size_t).
Yes, so, if I look at the ifdef posted above (note WIN64 --> what happens on linux 64 bit ??) :
if WIN64 bit --> size_t ==> 64 bits BUT unsigned long is also 64 bit on 64 bits machines
else (considering this means 32 bit !!!! ??)
unsigned long ==> 32 bits, but size_t is also 32 bits here
Meaning that either unsigned long can be used in both cases, or for that matter size_t can be used for both.
When using unsigned long for printf '%lu' can be used,
and for size_t "%zu"