#include <stdio.h>  // for printf
#include <limits.h> // for upper and lower bounds of integers
#include <float.h>  // for upper and lower bounds of floating points

int main(int argc, char *argv[])
{
  // char limits
  printf("char size: %d bytes\n", sizeof(char));
  printf("char lower limit: %d\n", CHAR_MIN);
  printf("char upper limit: %d\n", CHAR_MAX);

  printf("\n");

  // int limits
  printf("int size: %d bytes\n", sizeof(int));
  printf("int lower limit: %d\n", INT_MIN);
  printf("int upper limit: %d\n", INT_MAX);

  printf("\n");

  // short limits
  printf("short size: %d bytes\n", sizeof(short));
  printf("short lower limit: %hd\n", SHRT_MIN);
  printf("short upper limit: %hd\n", SHRT_MAX);

  printf("\n");

  // long limits
  printf("long size: %d bytes\n", sizeof(long));
  printf("long lower limit: %ld\n", LONG_MIN);
  printf("long upper limit: %ld\n", LONG_MAX);

  printf("\n");

  // unsigned int limits
  printf("unsigned int size: %d bytes\n", sizeof(unsigned int));
  printf("unsigned int lower limit: 0\n");
  printf("unsigned int upper limit: %u\n", UINT_MAX);

  printf("\n");

  // float limits
  printf("float size: %d bytes\n", sizeof(float));
  printf("float lower limit: %f\n", FLT_MIN);
  printf("float upper limit: %f\n", FLT_MAX);

  printf("\n");

  // double limits
  printf("double size: %d bytes\n", sizeof(double));
  printf("double lower limit: %f\n", DBL_MIN);
  printf("double upper limit: %f\n", DBL_MAX);

  printf("\n");

  return 0;
}