We are running a survey to help us improve the experience for all of our members. If you see the survey appear, please take the time to tell us about your experience if you can.
I want to multiply two fixed point numbers. After the multiplication I have to shift the result so that the binary point is correct. Example:
int a; int b; int c; c = (a * b) >> 10
I don't know the '166, but I suspect this is a 'C' issue rather than a processor issue. You could look up the promotion rules in K&R, or you could just try experimenting with casting a, b, and/or the product to long.
As Andrew said, this is a C issue. Take your favourite book on C and read about types and expressions. There are a few pitfalls there. If both operands a and b are of type int, then the product (a * b) will be of type int, which is not what you are expecting. If you want the result to be of type long, try ((long)a * b): it will suffice to cast one of the operands to long. Make sure you take care of overflows and that you understand the differences between signed and unsigned arithmetics. - mike
That's it! The following line produces just what I wanted: c = ((long)a * b)>>10; The product a*b is stored as 32 bit value in MD register, then the MD register value is arithmetic shifted right by 10 and the lower 16 bits stored in c. Thanks to Andrew and Mike!