This discussion has been locked.
You can no longer post new replies to this discussion. If you have a question you can start a new discussion

A new Bug

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.

Parents
  • 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.

Reply
  • 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.

Children
  • 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。