Click on types.c to get source.
#include <limits.h>
#include <stdio.h>

/* The following preprocessor macro defines a user set type integer
   that is guaranteed to have sizeof(integer) == 4, i.e. 32 bits */
#if SHORT_MAX == 2147483647
    #define integer short
#elif INT_MAX == 2147483647
    #define integer int
#elif LONG_MAX == 2147483647
    #define integer long
#else
    #error "No integer type with 4 bytes"
    #define integer void
#endif

/* Now define the range of type integer */
#define INTEGER_MAX 2147483647  /* exp2(31) - 1; see math.h */
#define INTEGER_MIN -2147483648 /* exp2(31)     */
#define UINTEGER_MAX 4294967295u /* exp2(32) - 1 */

/* This program exhibits some subtle points for the basic C types */

int main(void)
{short s = SHRT_MAX; int i = INT_MIN; unsigned u = INT_MAX;
 long L = LONG_MAX; unsigned long uL = ULONG_MAX;
 unsigned integer uinteg = UINTEGER_MAX;
 char c = CHAR_MAX;

 /* short, int, long, unsigned, unsigned long */
 printf("sizeof(short) == %lu, SHRT_MAX == %d, ++s == %d\n\n",
        sizeof(short), SHRT_MAX, ++s);
 printf("sizeof(int) == %lu, INT_MIN == %d, INT_MAX == %d, --i == %d\n\n",
        sizeof(int), INT_MIN, INT_MAX, --i);
 printf("sizeof(unsigned) == %lu, UINT_MAX == %u, ++u == %u\n\n",
        sizeof(unsigned), UINT_MAX, ++u);
 printf("sizeof(long) == %lu, LONG_MAX == %li, ++L == %li\n\n",
        sizeof(unsigned), LONG_MAX, ++L);
 printf("sizeof(unsigned long) == %lu, ULONG_MAX == %lu, ++uL == %lu\n\n",
        sizeof(unsigned long), ULONG_MAX, ++uL);

 /* Test macro for type integer */
 printf("sizeof(integer) == %lu, uinteg == %u\n\n", sizeof(integer), uinteg);

 /* char type */
 printf("sizeof(char) == %lu, CHAR_MAX == %d\n", sizeof(char), CHAR_MAX);
 printf("(int) c == %d, (int)((signed char)(c << 1)) == %d, (unsigned)((unsigned char)(c << 1)) == %u\n",
        c, (signed char)(c << 1), (unsigned char)(c << 1));
 printf("(int) (c >> 1) == %d, (int) ++c == %d, (unsigned)((unsigned char)c) == %u\n",
        c >> 1, ++c, (unsigned char)c);
 return 0;
}