По факту sizeof(int) == 4 (99.9% систем)
sizeof(long) == 4 (Windows)
sizeof(long) == sizeof(void*) (99% НЕ Windows систем, т. е. обычно 4 или 8, в зависимости от битности приложения)
В этом смысле "long" перестал быть нужным типом. Не очень понятно, зачем его теперь использовать.
А long long [int] - это вообще другой тип, он практически везде (где он есть) 64 бита, но разговор не о нем.
PS. Вот из ссылки
Бенциона самая главная цитата:
32 bit systems:
<16-битный WinAPI, который для меня уже не существует>
Потом:
ILP32 or 4/4/4 (int, long, and pointer are 32-bit); Win32 API, Unix and Unix-like systems (Linux, Mac OS X)
64 bit systems:
LLP64 or 4/4/8 (int and long are 32-bit, pointer is 64-bit) Win64 API
LP64 or 4/8/8 (int is 32-bit, long and pointer are 64-bit) Unix and Unix-like systems (Linux, Mac OS X)
Other models are VERY RARE
PPS. В общем, люди, занимающиеся мног лет мультиплатформенной разработкой, обычно неформально формулируют правила так для краткости:
- Разрядность приложения по определению равна sizeof(void*)
- int = 32 бита (99% случаев)
- long long [int] = 64 бита (99% случаев, где он есть вообще, а есть он в новых стандартах языков либо в расширениях к старым)
- long [int] = бардак