OK, I found it. `long` is only guarantee to be 32bit, so it cannot be used.
The correct data type would be `intptr_t` or `uintptr_t`, but for the conversion, still we need `strtoll` or `ull`