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

Wrong result using unsigned 32 bit calculations

Hi,

I experienced a problem with uint32 calculations.

The following code calculates a wrong result. Has anyone found other problems with the unsigned long integer data type?

xdata unsigned int test1 = 66;
xdata unsigned int test2 = 1000;
xdata unsigned long int result;

int main () {

  result=(unsigned long int)test1*(unsigned long int)test2;

  // result is 464 instead of 66000
  // it seems that the compiler does the calculation
  // with 16 bit operations
}

The same code works correct when using signed long int.

Parents
  • Your answer is 66*1000 - 65536, so they performed the evaluation using a 16-bit multiplication, loosing the overflow.

    The type cast to 32-bit should have had a higher priority than the multiplication so it shouldn't matter if integer promotion was active or not. And even without integer promotion, the right-hand side was 32-bit unsigned even with broken precedence rules, in which case the C language requires that both sides gets promoted to 32-bit unsigned.

    Might be time to contact Keil technical support.

    Are you using the most current version of the compiler?

Reply
  • Your answer is 66*1000 - 65536, so they performed the evaluation using a 16-bit multiplication, loosing the overflow.

    The type cast to 32-bit should have had a higher priority than the multiplication so it shouldn't matter if integer promotion was active or not. And even without integer promotion, the right-hand side was 32-bit unsigned even with broken precedence rules, in which case the C language requires that both sides gets promoted to 32-bit unsigned.

    Might be time to contact Keil technical support.

    Are you using the most current version of the compiler?

Children