Typecasting in C programming

Typecasting is a way to convert variables, constants or expression from one type to another type. Conversion from one type to another is often required in programming.

Consider a case where you want to find average of three numbers. Let us write a program to find average of three numbers.

#include <stdio.h>

int main()
{
int num1, num2, num3;
float average;
num1 = 91;
num2 = 85;
num3 = 83;

average = (num1 + num2 + num3) / 3;

printf("Average = %f", average);

return 0;
}

Average of 91, 85 and 83 is 86.33. But our program shows 86. What's wrong going here? Is the C compiler gone mad? Why it is not showing exact average? I have also used float data type that is capable of storing real types.

It's not the compilers fault. In the expression (num1 + num2 + num3) / 3, all variables and literals are integer type. Hence, integer division is performed instead of float division.

To ensure fractional division, we must typecast one of the operands to float. In the expression (float) (num1 + num2 + num3) / 3. Parenthesis and typecast operator has highest precedence. Hence, first sum of num1 + num2 + num3 is evaluated and converted to float type. Then after division is performed.

So to overcome the above integer division, we must typecast the expression to float type.

C supports two types of typecasting -

Implicit typecasting

Implicit typecast is automatic type conversion done by the compiler. Compiler automatically handles data type conversion. It converts variables and constants of lower type to higher type whenever required.

The automatic type conversion done by the compiler uses integer promotion rule.

Integer promotion

Compilers are smart at optimizing code for better performance. In the process of code optimization, the C compiler will perform integer promotion. The compiler automatically converts all operands to a common type (higher type used in expression). The process of converting a lower type to higher is known as integer promotion.

Example of implicit typecast

#include <stdio.h>
int main()
{
char ch = 'A';
int val = ch + 10; /* char ch is promoted to int before addition */

printf("val = %d", val);

return 0;
}

In the above program char is automatically converted to higher type int before performing addition.

Important note: Implicit conversion may result in data or sign loss. For example - when promoting long long to unsigned long long negative sign is lost. Also while promoting unsigned long long to float you may lose data.

Hence, it is often recommended to cast explicitly.

Explicit typecasting

Explicit typecasting is manual type conversion from one type to another type. In explicit cast we have full control over the conversion. Explicit conversion can be performed bi-directional i.e. you can cast both a lower type to higher as well as a higher type to lower.

Syntax of explicit typecast

(new-type) <variable-expression-literal>

Where new-type is a valid C data type.

Example of explicit typecast

#include <stdio.h>

int main()
{
int num1, num2, num3;
float average;
num1 = 91;
num2 = 85;
num3 = 83;

average = (float)(num1 + num2 + num3) / 3;

printf("Average = %f", average);

return 0;
}

Important note: Explicit typecasting can also result in data loss. Conversion from float to int will lose decimal part. 