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

XC 167: 2s complement fractional format

Hello,
I'm trying to use 2s complement fractional format in XC 167 a and I have following problem with multiplication:

 /*2s complement fractional format - multiplication test*/

#include <XC167.h>
#include <intrins.h>

signed short int a = 1024;  // = 0.03125
signed short int b = 1024;  // = 0.03125
signed short int c, x;

void main (void)
{
MCW = 0x0400;               //MP = 1, automatic shift 1 bit left

x = b * a;
c = MDH;

} 

The result c is 16d and I expect 32d (0.0009765625). Product after multiplication is not shifted one bit left.

Can anyone give me a rough idea how to use 2s complement fractional format?

I'm using uVision2 and C is recommended.

Thank you
Pavel

Parents
  • What made you think that shift by one would magically be applied for you without your code saying so?

    The code you've written makes assumptions that are plainly wrong for the actual data you're passing into and out of it. The code assumes the fixed-point numbers are shifted by 16 bits, but they're actually only shifted by 15 (plus a sign bit).

    Your best solution may be to drop the ties to a particular hardware and its registers, and use 32-bit integers and explicit shifts instead:

    c = ((signed long)a * b) >> 15;

    But make sure that C166 handles shifts of signed integers as expected before you use this.

Reply
  • What made you think that shift by one would magically be applied for you without your code saying so?

    The code you've written makes assumptions that are plainly wrong for the actual data you're passing into and out of it. The code assumes the fixed-point numbers are shifted by 16 bits, but they're actually only shifted by 15 (plus a sign bit).

    Your best solution may be to drop the ties to a particular hardware and its registers, and use 32-bit integers and explicit shifts instead:

    c = ((signed long)a * b) >> 15;

    But make sure that C166 handles shifts of signed integers as expected before you use this.

Children