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.
Just tried an online compiler. If the modulo is part of the expression, then it should be promoted to unsigned int before modulo. Therefore 0x178%255 = 0x79.
Actually I think, one cannot rely on a result of a computation if the size of the variable does not fit. So it is not a bug, no matter if the result is 0x79 or 0x78.
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。