# Typecasting Resources

It seems that many students are bitten by the typecasting bug. I cannot seem to find a definitive reference on typecasting for FIRST and would like to generate some more documentation on this topic. Are there any specific “sections” or white papers that cover this topic? If not, I will consider writing one…

Please post your examples and resources that you would like me to include.

-Brian

The MPLAB C18 Compiler User’s Guide goes over the peculiarities of the PIC18’s type conversion system, which actually goes against the ISO C mandates regarding automatic type conversions.

I suspect the underlying problem is that the students don’t understand the size implications of the different variable types and what happens when you invoke arithmetic operations where the result exceeds that size. Or just how easy it is to exceed the size. Simply adding two quantities can produce an overflow. Also, with integer arithmetic the order the operations are specified can how a profound impact on the result. Understanding these topics is required to understand why most of the casting that is needed to program the FIRST RC is necessary.

That sums it up pretty well. I plan on creating a resource to spread the understanding of this issue. It is mentioned sporadically, but never really explained in the FIRST documents that I have browsed…

The simplest example I can think of is:

char x = 65;
char y = 66;

char a;
int b;

/* a is not large enough to hold 131 even if the arithmetic did what was expected. a equals -125. */
a = x + y;

/* b = large enough to hold 131 but the arithmetic will still be done as above since the compiler doesn’t look at the left side of the equation. */
b = x + y;

/* Force the arithmetic to be done in 16 bits by casting one of the members */

/* a still can’t hold 131 but the compiler should issue a warning for loss of precision if the warning level isn’t high enough. ALWAYS set the warning level as high as possible! */
a = (int) x + y;

/* This gets rid of the warning but is still wrong. */
a = (char) ((int) x + y);

/* The “correct” way to do it. b = 131 */
b = (int) x + y;