码迷,mamicode.com
首页 > 其他好文 > 详细

Fixed-point multiplication (C166 A*B/B)

时间:2018-12-09 18:45:56      阅读:144      评论:0      收藏:0      [点我收藏+]

标签:-o   border   http   cti   .com   his   技术分享   sso   code   

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

The multiplication a*b produces a long int value in the MD register. After the shift operation the int result (the lower byte) should be stored in c.
My problem is how to use then 32-bit MD register. When I look at the assembler code only the lower byte of the MD register is used for the shift operation, but I first I want to shift the whole register and then take only the lower byte.
How can I implement that in C? Who knows an application note about fixed-point arithmetic with the C166?
 
Read-Only
Author
Andrew Neil
Posted
22-Oct-2003 09:34 GMT
Toolset
C166
技术分享图片 RE: Fixed-point multiplication
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.
 
Read-Only
Author
Mike Kleshov
Posted
22-Oct-2003 09:56 GMT
Toolset
C166
技术分享图片 RE: Fixed-point multiplication
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
 
Read-Only
Author
Bruno Büsser
Posted
22-Oct-2003 10:45 GMT
Toolset
C166
技术分享图片 RE: Fixed-point multiplication
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!

http://www.keil.com/forum/3549/

 

Fixed-point multiplication (C166 A*B/B)

标签:-o   border   http   cti   .com   his   技术分享   sso   code   

原文地址:https://www.cnblogs.com/xihong2014/p/10092267.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!