unsigned char aa,bb,cc,dd; aa = 0xab; bb = 0xcd; cc = (aa+bb)%255; //aa+bb=0x178 dd = (unsigned char)((aa+bb)%255);
when debug, youcan see that the result: cc is 0x78, dd is 0x79. In fact, cc and dd should be 0x79.
I debugged in C51 9.60, 9.03. Both had the same output.
I tried in VC2010, TI CCS3.3, both can get the correct result, 0x79.
wfy1008 said:I debugged in C51 9.60, 9.03. Both had the same output.
I'm not using C51 today, but there is a checkbox in Target Options somewhere that alters integer promotion. Change it. The cost will be a bit of code size and potentially speed. Broeker I believe is correct regarding the rules of C versus C51. Also you can typecast and/or user intermediate variables of different types to learn what is happening.
Thank you for your reply.
My code uses parentheses to clearly indicate the operation priority, that is, first operate "aa + bb", then operate modulus 255, and then convert to "unsigned char"。The two lines of code differ only in the last step, I think their output should be the same in this operation as above。
My point wasn't parentheses, but integer promotion (or lack thereof). Look for the checkbox I mentioned.