## Sep 7, 2016

### K & R : Exercise 2.1 - Range of char, short, int and long

K & R : Exercise 2.1 - Range of char, short, int and long

## Problem

Write a Program to determine the ranges of char, short, int and long variables. Both signed and unsigned by printing appropriate values from standard header and by direct computation. Harder if you compute them determine the ranges of various floating point types.

## Solution

We need to calculate it manually by using bit manipulation operations. Actually values can be found out in header file limits.h. In binary representation

• signed min -> MSB bit is 1 and rest all bits are 0.
• signed max -> MSB bit is 0 and rest all nits are 1.
• unsigned min -> It is always 0.
• unsigned max -> All bits are 1.

Implementing the above logic for different data-types we get the max and min value. Each of this max and min value can be verified against the symbolic const provided in limits.h. Now putting all the together into a program we get -.

#include <stdio.h>
#include <limits.h>
int main()
{
int char_min, char_max;
int uchar_min, uchar_max;

long int_min, int_max;
long uint_min, uint_max;

char_min = (char)(1 << (sizeof(char) * 8 - 1));
char_max = ((char)(~0 & ~char_min));

printf("char MIN is %d, char MAX is %d\n", char_min, char_max);
printf("CHAR_MIN is %d, CHAR_MAX is %d\n", CHAR_MIN, CHAR_MAX);

uchar_min = (unsigned char)0;
uchar_max = (unsigned char)~0;

printf("unsigned char MIN is %d, unsigned char MAX is %d\n", uchar_min, uchar_max);
printf("UCHAR_MIN is %d, UCHAR_MAX is %d\n", 0, UCHAR_MAX);

int_min = (int)(1 << (sizeof(int) * 8 - 1));
int_max = ((int)(~0 & ~int_min));

printf("int MIN is %lld, int MAX is %lld\n", int_min, int_max);
printf("INT_MIN is %d, INT_MAX is %d\n", INT_MIN, INT_MAX);

uint_min = (unsigned int)0;
uint_max = (unsigned int)~0;

printf("unsigned int MIN is %lld, unsigned int MAX is %lld\n", uint_min, uint_max);
printf("UINT_MIN is %u, UINT_MAX is %u\n", 0, UINT_MAX);

return 0;
}

char MIN is -128, char MAX is 127
CHAR_MIN is -128, CHAR_MAX is 127
unsigned char MIN is 0, unsigned char MAX is 255
UCHAR_MIN is 0, UCHAR_MAX is 255
int MIN is -2147483648, int MAX is 2147483647
INT_MIN is -2147483648, INT_MAX is 2147483647
unsigned int MIN is 0, unsigned int MAX is 4294967295
UINT_MIN is 0, UINT_MAX is 4294967295