title: Do long long and long have same range in C in 64-bit machine?
body: <p>I saw in /usr/include/limits.h as </p>
  
  <pre><code>/* Minimum and maximum values a `signed long int' can hold.  */
  if __WORDSIZE == 64
   define LONG_MAX     9223372036854775807L
  else
   define LONG_MAX     2147483647L
  endif
  define LONG_MIN      (-LONG_MAX - 1L)
  /* Maximum value an `unsigned long int' can hold.  (Minimum is 0.)  */
  if __WORDSIZE == 64
   define ULONG_MAX    18446744073709551615UL
  else
   define ULONG_MAX    4294967295UL
  endif
  ifdef __USE_ISOC99
  
  /* Minimum and maximum values a `signed long long int' can hold.  */
  define LLONG_MAX    9223372036854775807LL
  define LLONG_MIN    (-LLONG_MAX - 1LL)
  
  /* Maximum value an `unsigned long long int' can hold.  (Minimum is 0.)    */
   define ULLONG_MAX   18446744073709551615ULL
  </code></pre>
  
  <p>So <code>unsigned long long int</code> and <code>unsigned long int</code> seem to have same max value of 18446744073709551615 ...</p>
  
  <p>Does that mean <code>long long</code> means same as <code>long</code> in this machine?
  If so, why then do we have a separate <code>long long</code> specifier?</p>
  
  <p>From reading C books, I expected <code>long long</code> to be double the size of <code>long</code>.
  Am I going wrong somewhere?
  (But yes, I agree with standards that <code>int &gt;= short int</code>, <code>long &gt;= int</code>, but it is hard to digest <code>long long &gt;= long</code>.)</p>