Does anybody know, how one have to cast an operation correctly? And is it necessary to tell the compiler that a constant is unsined long
#define dword unsigned long unsigned char ucH; //hours unsigned char ucM; //minutes unsigned char ucS; //seconds dword ulTime; //Time in s GetTime(...); ulTime = ucS + ucM*60 + ucH*3600; [..]
ulTime = (dword)(ucS + ucM*60 + ucH*3600);
ulTime = ucS + (dword)ucM*60 + (dword)ucH*3600);
#define dword unsigned long unsigned char ucH; //hours unsigned char ucM; //minutes unsigned char ucS; //seconds dword ulTime; //Time in s GetTime(...); ulTime = ucS + ucM*60 + ucH*3600;
(ulong) = (uchar) + (uchar) * (int) + (uchar) * (int);
char * int = int char * long = long int * long = long int * int = int
(ulong) = (uchar) + (uchar) * (int) + (uchar) * (int); /* Is reduced to */ (ulong) = (uchar) + (int) + (int); /* Which is reduced to */ (ulong) = (int) + (int); /* Which is further reduced to */ (ulong) = (int);
ulTime = ucS + ucM * 60UL + ucH * 3600UL;
(ulong) = (uchar) + (uchar) * (ulong) + (uchar) * (ulong); /* Is reduced to */ (ulong) = (uchar) + (ulong) + (ulong); /* Which is reduced to */ (ulong) = (ulong) + (ulong); /* Which is further reduced to */ (ulong) = (ulong);
#define dword unsigned long unsigned char ucH; //hours unsigned char ucM; //minutes unsigned char ucS; //seconds dword ulTime; //Time in s ulTime = ucS + ucM * 60UL + ucH * 3600UL;
ucS and ucM are unsigned char, so they each have a maximum value of 255. 255 + 60 * 255 is 15555, well within the range of an int, so the constant sixty doesn't have to be an unsigned long. Ahhh. Yes. You are right about that. I noticed that the multiplication with 3600 would definitely be out of range and assumed that the multiplication with 60 would be as well (assuming that NOINTPROMOTE is used.) Jon
View all questions in Keil forum