View Full Version : What the...? casting bug?
gnormhurst
03-22-2004, 02:02 PM
'splain this, somebody:
#define STRAIGHT_DRIVE_DIRECTION ( 127 + 30 )
static int steeringValue = 0;
. . .
steeringValue = (int) ((STRAIGHT_DRIVE_DIRECTION));
printf( "nav: DTC %3d ", steeringValue );
That printed a value of -99! Why?
Changing the assignment to:
steeringValue = (int) ((unsigned char) (STRAIGHT_DRIVE_DIRECTION));
made it print "157" as expected the first time.
Is this weird, or is there something about type casting I don't understand?
gnormhurst
03-22-2004, 02:08 PM
Ohhhhhhh!
Funny how you understand something as soon as you post it.
The compiler takes (127 + 30) and performs signed 8-bit arithmetic, yielding -99. Casting as a signed (int) duly kept the sign: -99. Casting as an unsigned char reinterpreted the value as 157, which was then cast as a signed int: 157.
My error was in assuming that constants were treated as unsigned chars, but they are treated as signed chars.
Ryan M.
03-22-2004, 02:18 PM
Ohhhhhhh!
Funny how you understand something as soon as you post it.
The compiler takes (127 + 30) and performs signed 8-bit arithmetic, yielding -99. Casting as a signed (int) duly kept the sign: -99. Casting as an unsigned char reinterpreted the value as 157, which was then cast as a signed int: 157.
My error was in assuming that constants were treated as unsigned chars, but they are treated as signed chars.That is exactly what happened. :)
Greg Ross
03-22-2004, 02:20 PM
Boy, you guys are fast. :)
Norm, I think if you had used
#define STRAIGHT_DRIVE_DIRECTION ( 127u + 30 )you would have been ok.
Astronouth7303
03-22-2004, 03:49 PM
There's a compuler option for that. Project>Build Options...>Project. Go to MPLAB C18. check "Treat 'char' as unsigned" (under Category General). The command-line flag is '-k'
vBulletin® v3.6.4, Copyright ©2000-2012, Jelsoft Enterprises Ltd.