this is why dangerous use default C type
unsigned long is 8 byte wide (on x64), but 32 bit wide (on x86 arch).
unsigned long