In today's cross-platform C++ (or C) world we [have][1]: <!-- language: lang-none --> Data model | short | int | long | long long | pointers/size_t | Sample operating systems ... LLP64/IL32P64 16 32 32 64 64 Microsoft Windows (x86-64 and IA-64) LP64/I32LP64 16 32 64 64 64 Most Unix and Unix-like systems, e.g. Solaris, Linux, BSD, and OS X; z/OS ... What this means today, is that for any "common" (signed) integer, `int` will suffice and can possibly still be used as the default integer type when writing C++ application code. It will also - *for current practical purposes* - have a consistent size across platforms. Iff a use case requires at least 64 bits, we can today use `long long`, though possibly using one of the [bitness-specifying types][2] or the `__int64`type might make more sense. This leaves `long`in the middle, and **we're considering outright banning the use of `long` from our application code**. **Would this make sense**, or is there a case for using `long` in modern C++ (or C) code that has to run cross platform? (platform being desktop, mobile devices, but not things like microcontrollers, DSPs etc.) ----- Possibly interesting background links: * [What does the C++ standard state the size of int, long type to be?][3] * [Why did the Win64 team choose the LLP64 model?](https://blogs.msdn.microsoft.com/oldnewthing/20050131-00/?p=36563/) * [64-Bit Programming Models: Why LP64?][4] (somewhat aged) * [Is `long` guaranteed to be at least 32 bits?][5] (This addresses the comment discussion below. [Answer][6].) [1]: https://en.wikipedia.org/wiki/64-bit_computing#64-bit_data_models [2]: http://en.cppreference.com/w/cpp/types/integer [3]: http://stackoverflow.com/questions/589575/what-does-the-c-standard-state-the-size-of-int-long-type-to-be [4]: http://www.unix.org/version2/whatsnew/lp64_wp.html [5]: http://stackoverflow.com/questions/4329777/is-long-guaranteed-to-be-at-least-32-bits [6]: http://stackoverflow.com/a/4337544/321013