As I've learned recently, a long in C/C++ is the same length as an int. To put it simply, why? It seems almost pointless to even include the datatype in the language. Does it have any uses specific to it that an int doesn't have? I know we can declare a 64-bit int like so:
long long x = 0;
But why does the language choose to do it this way, rather than just making a long well...longer than an int? Other languages such as C# do this, so why not C/C++?
When writing in C or C++, every datatype is architecture and compiler specific. On one system int is 32, but you can find ones where it is 16 or 64; it's not defined, so it's up to compiler.
As for
long
andint
, it comes from times, where standard integer was 16bit, wherelong
was 32 bit integer - and it indeed was longer thanint
.long is not the same length as an int. According to the specification, long is at least as large as int. For example, on Linux x86_64 with GCC, sizeof(long) = 8, and sizeof(int) = 4.
looking for something completely unrelated and stumbled across this and needed to answer. Yeah, this is old, so for people who surf on in later...
Frankly, I think all the answers on here are incomplete.
The size of a long is the size of the number of bits your processor can operate on at one time. It's also called a "word". A "half-word" is a short. A "doubleword" is a long long and is twice as large as a long (and originally was only implemented by vendors and not standard), and even bigger than a long long is a "quadword" which is twice the size of a long long but it had no formal name (and not really standard).
Now, where does the int come in? In part registers on your processor, and in part your OS. Your registers define the native sizes the CPU handles which in turn define the size of things like the short and long. Processors are also designed with a data size that is the most efficient size for it to operate on. That should be an int.
On todays 64bit machines you'd assume, since a long is a word and a word on a 64bit machine is 64bits, that a long would be 64bits and an int whatever the processor is designed to handle, but it might not be. Why? Your OS has chosen a data model and defined these data sizes for you (pretty much by how it's built). Ultimately, if you're on Windows (and using Win64) it's 32bits for both a long and int. Solaris and Linux use different definitions (the long is 64bits). These definitions are called things like ILP64, LP64, and LLP64. Windows uses LLP64 and Solaris and Linux use LP64:
Where, e.g., ILP means int-long-pointer, and LLP means long-long-pointer
To get around this most compilers seem to support setting the size of an integer directly with types like int32 or int64.
The specific guarantees are as follows:
char
is at least 8 bits (1 byte by definition, however many bits it is)short
is at least 16 bitsint
is at least 16 bitslong
is at least 32 bitslong long
(in versions of the language that support it) is at least 64 bitsThus it makes sense to use
long
if you need a type that's at least 32 bits,int
if you need a type that's reasonably fast and at least 16 bits.Actually, at least in C, these lower bounds are expressed in terms of ranges, not sizes. For example, the language requires that
INT_MIN <= -32767
, andINT_MAX >= +32767
. The 16-bit requirements follows from this and from the requirement that integers are represented in binary.C99 adds
<stdint.h>
and<inttypes.h>
, which define types such asuint32_t
,int_least32_t
, andint_fast16_t
; these are typedefs, usually defined as aliases for the predefined types.(There isn't necessarily a direct relationship between size and range. An implementation could make
int
32 bits, but with a range of only, say,-2**23 .. +2^23-1
, with the other 8 bits (called padding bits) not contributing to the value. It's theoretically possible (but practically highly unlikely) thatint
could be larger thanlong
, as long aslong
has at least as wide a range asint
. In practice, few modern systems use padding bits, or even representations other than 2's-complement, but the standard still permits such oddities. You're more likely to encounter exotic features in embedded systems.)long
is not the same size asint
, it is at least the same size asint
. To quote the C++03 standard (3.9.1-2):My interpretation of this is "just use
int
, but if for some reason that doesn't fit your needs and you are lucky to find another integral type that's better suited, be our guest and use that one instead". One way thatlong
might be better is if you 're on an architecture where it is... longer.