Monday, May 16, 2011

Are there any problems with performing mathematical operations on different variable types?

C has three categories of built-in data types: pointer types, integral types, and floating-point types.
Pointer types are the most restrictive in terms of the operations that can be performed on them. They are
limited to
- subtraction of two pointers, valid only when both pointers point to elements in the same array. The result
is the same as subtracting the integer subscripts corresponding to the two pointers.
+ addition of a pointer and an integral type. The result is a pointer that points to the element which would
be selected by that integer.
Floating-point types consist of the built-in types float, double, and long double. Integral types consist of
char, unsigned char, short, unsigned short, int, unsigned int, long, and unsigned long. All of these types
can have the following arithmetic operations performed on them:
+ Addition
- Subtraction
* Multiplication
/ Division
Integral types also can have those four operations performed on them, as well as the following operations:
% Modulo or remainder of division
<< Shift left >> Shift right
& Bitwise AND operation
| Bitwise OR operation
^ Bitwise exclusive OR operation
! Logical negative operation
~ Bitwise “one’s complement” operation
Although C permits “mixed mode” expressions (an arithmetic expression involving different types), it
actually converts the types to be the same type before performing the operations (except for the case of pointer
arithmetic described previously)

What is operator promotion?

If an operation is specified with operands of two different types, they are converted to the smallest type that
can hold both values. The result has the same type as the two operands wind up having. To interpret the rules,
read the following table from the top down, and stop at the first rule that applies.
If Either Operand Is And the Other Is Change Them To
long double any other type long double
double any smaller type double
float any smaller type float
unsigned long any integral type unsigned long
long unsigned > LONG_MAX unsigned long
long any smaller type long
unsigned any signed type unsigned
The following example code illustrates some cases of operator promotion. The variable f1 is set to 3 / 4.
Because both 3 and 4 are integers, integer division is performed, and the result is the integer 0. The variable
f2 is set to 3 / 4.0. Because 4.0 is a float, the number 3 is converted to a float as well, and the result is
the float 0.75.
#include
main()
{
float f1 = 3 / 4;
float f2 = 3 / 4.0;
printf(“3 / 4 == %g or %g depending on the type used.\n”,
f1, f2);
}