I am learning C programming online on my own so that I can be prepared for College in Winter 2016. I am learning about data types right now.
I don't understand the difference between:
long long integers in C programming
C was originally written for 16-bit machines, where the fastest and most-convenient size of integer to work with were 16 bits. This was the original
int type. Sometimes, programmers needed 32-bit numbers, so those were the
long int type.
In due course, people ported C to 32-bit machines where the most convenient word size was 32 bits. They wanted to keep using
int to mean the native word size, because for example about every C program in the real world has
int i; in it somewhere, but sometimes, they also needed to use 16-bit numbers to save space. So those became the
short int type.
Time passed, and C needed to be ported to 64-bit machines. By then, there were a lot of programs in existence that assumed
long was exactly 32 bits wide, and unfortunately, a lot of programs that also assumed that a
long was the same size as a pointer, an IPv4 address, a file offset, a timestamp, etc. Good code uses types such as
off_t instead, but old versions of the system libraries defined their library functions to use
long, so a lot of legacy code had to as well. Since C99 came out, there have also been types such as
int32_t in the standard library to specify exact widths, and Unix and Windows have had them under different names for a while.
As a consequence of the types being used to mean contradictory things, compilers today give programmers the choice between
long being 32 and 64 bits wide, and 64-bit compilers let
int be either 32 or 64 bits wide, too. At least one real compiler defined
int as 64 bits (the native word length) but
long as 32 bits (so the system libraries and code would still work).
Because a lot of programs couldn't redefine
long as 64 bits without breaking, C needed a new type that meant (at least) 64-bit. By then, the standards committee was reluctant to introduce new keywords outside a header file, so they reused an existing one instead and named it
long long int.
In brief, you shouldn’t make assumptions about what
long mean beyond that
int is at least 16 bits wide and fast, and
long is at least 32 bits wide. For general purposes, use
int. If you need an array index, use
ptrdiff_t. If you want to be sure you can hold a number over 32,767, and seriously expect you might need to run on some 16-bit machine someday, use
long or the fast type from
<inttypes.h>. If you’re making a system call, use the same type as its arguments. If you’re storing a pointer in an integer type, use
uintptr_t. If you need a number at least 64 bits wide, use
long long, and if you know exactly the width you need, use the exact-width type.