C - Data Type Limit

Introduction

limits.h header file defines symbols that represent values for the limits for each type.

The following table shows the symbols names corresponding to the limits for each signed integer type.

TypeLower limit Upper limit
charCHAR_MIN CHAR_MAX
short SHRT_MIN SHRT_MAX
int INT_MIN INT_MAX
longLONG_MIN LONG_MAX
long long LLONG_MIN LLONG_MAX

The lower limits for the unsigned integer types are all 0, so there are no symbols for these.

The symbols corresponding to the upper limits for the unsigned integer types are UCHAR_MAX, USHRT_MAX, UINT_MAX, ULONG_MAX, and ULLONG_MAX.

To use any of these symbols, you must have an #include directive for the limits.h header file in the source file:

#include <limits.h>

You could initialize a variable with the maximum possible value for type int like this:

int number = INT_MAX;

The float.h header file defines symbols that characterize floating-point values.

The symbols defining the maximum and minimum positive values that can be represented by the three floating-point types are shown in the following table.

Type Lower limit Upper limit
float FLT_MIN FLT_MAX
double DBL_MIN DBL_MAX
long doubleLDBL_MIN LDBL_MAX

The following program outputs the values corresponding to the symbols defined in the header files, so it will tell you the limits for your compiler.

Demo

#include <stdio.h>                          // For command line input and output
#include <limits.h>                         // For limits on integer types
#include <float.h>                          // For limits on floating-point types

int main(void)
{
      printf("Variables of type char store values from %d to %d\n", CHAR_MIN, CHAR_MAX);
      printf("Variables of type unsigned char store values from 0 to %u\n", UCHAR_MAX);
      printf("Variables of type short store values from %d to %d\n", SHRT_MIN, SHRT_MAX);
      printf("Variables of type unsigned short store values from 0 to %u\n", USHRT_MAX);
      printf("Variables of type int store values from %d to %d\n", INT_MIN,  INT_MAX);
      printf("Variables of type unsigned int store values from 0 to %u\n", UINT_MAX);
      printf("Variables of type long store values from %ld to %ld\n", LONG_MIN, LONG_MAX);
      printf("Variables of type unsigned long store values from 0 to %lu\n", ULONG_MAX);
      printf("Variables of type long long store values from %lld to %lld\n", LLONG_MIN, LLONG_MAX);
      printf("Variables of type unsigned long long store values from 0 to %llu\n", ULLONG_MAX);

      printf("\nThe size of the smallest positive non-zero value of type float is %.3e\n", FLT_MIN);
      printf("The size of the largest value of type float is %.3e\n", FLT_MAX);
      printf("The size of the smallest non-zero value of type double is %.3e\n", DBL_MIN);
      printf("The size of the largest value of type double is %.3e\n", DBL_MAX);
      printf("The size of the smallest non-zero value of type long double is %.3Le\n", LDBL_MIN);
      printf("The size of the largest value of type long double is %.3Le\n",  LDBL_MAX);
      printf("\n Variables of type float provide %u decimal digits precision. \n", FLT_DIG);
      printf("Variables of type double provide %u decimal digits precision. \n", DBL_DIG);
      printf("Variables of type long double provide %u decimal digits precision. \n", LDBL_DIG);
      return 0;/*w  w  w . ja  va2s . co  m*/
}

Result

how It Works

You output the values of symbols that are defined in the limits.h and float.h header files in a series of printf() function calls.

%u specifier outputs the unsigned integer values.

%e specifier is for the floating-point limits, which presents the values in exponential form.

We specify just three digits' precision, as we don't need the full accuracy in the output.

L modifier is necessary when the value being displayed by the printf() function is type long double.

the %f specifier presents values without an exponent.