From: Scott B. <br...@ri...> - 2003-06-26 05:16:58
|
"warning: left shifting more than size of object changed to zero" To the sdcc developer that wrote this error message: THANK YOU!!!! The line that generated this follows. EP2BCH and EP2BCL are unsigned chars, count is an unsigned word: count = (EP2BCH << 8) | EP2BCL; I guess the Keil compiler erroneoulsy promotes the data type to contain the entire shift, whereas sdcc recognizes that all bits have been shifted out and just sets the high byte to 0. The corrected line is, of course: count = ((WORD)EP2BCH << 8) | EP2BCL; That would have been a bitch to debug. Way to go sdcc! -- Scott Bronson <br...@ri...> |
From: Bernhard H. <Ber...@be...> - 2003-06-26 08:25:58
|
> "warning: left shifting more than size of object changed to zero" > > To the sdcc developer that wrote this error message: THANK YOU!!!! > > > The line that generated this follows. EP2BCH and EP2BCL are unsigned > chars, count is an unsigned word: > > count = (EP2BCH << 8) | EP2BCL; > > I guess the Keil compiler erroneoulsy promotes the data type to > contain the entire shift, Keil is doing right. ANSI says, that everything smaller than int has to be promoted to int before any operation. SDCC (and many other C compiler) try to avoid this promotion, but this optimization must not influence the result. I think SDCC has a problem here. Bernhard |
From: Tim W. <sdc...@wo...> - 2003-06-26 13:43:23
|
On Thu, 26 Jun 2003, Bernhard Held wrote: > > "warning: left shifting more than size of object changed to zero" > > > > To the sdcc developer that wrote this error message: THANK YOU!!!! > > > > > > The line that generated this follows. EP2BCH and EP2BCL are unsigned > > chars, count is an unsigned word: > > > > count = (EP2BCH << 8) | EP2BCL; > > > > I guess the Keil compiler erroneoulsy promotes the data type to > > contain the entire shift, > Keil is doing right. ANSI says, that everything smaller than int has to be > promoted to int before any operation. > SDCC (and many other C compiler) try to avoid this promotion, but this > optimization must not influence the result. I think SDCC has a problem here. > You are correct that Keil is doing the correct thing here and SDCC has a problem. However, the cast is probably also required as left shifting a signed integer has undefined behaviour at overflow. (6.7.3 para 4) The warning is also "kinder" than it needs to be. Left shifting (or right shifting) by the size of the object (after implicit promotions) is also undefined behaviour according to the C standard. There is nothing wrong with SDCC defining this behaviour but the construct isn't portable. (6.7.5 para 3) Tim. -- God said, "div D = rho, div B = 0, curl E = - @B/@t, curl H = J + @D/@t," and there was light. http://tjw.hn.org/ http://www.locofungus.btinternet.co.uk/ |
From: Tim W. <sdc...@wo...> - 2003-06-26 14:29:33
|
On Thu, 26 Jun 2003, Tim Woodall wrote: > (6.7.3 para 4) > (6.7.5 para 3) Doh! 6.5.7 in both cases. Tim. -- God said, "div D = rho, div B = 0, curl E = - @B/@t, curl H = J + @D/@t," and there was light. http://tjw.hn.org/ http://www.locofungus.btinternet.co.uk/ |