Unsigned int to signed int conversion

Discussion in 'Programmer's Corner' started by aamirali, Jul 22, 2013.

  1. aamirali

    Thread Starter Member

    Feb 2, 2012
    415
    1
    I have uint16_t type of data from ADC conversion register, which can take value from 0 - 30000. This is after multiplication by some constant.

    Now I have to print it on graph, & have to level shift from mid point so I got negative value range i.e -15000 to +15000.

    What should be correct conversion method like

    uint16_t val;

    int16_t conv_val;

    if( val > 32767 )

    {

    val = 32767; /* limit it for avoiding saturation as conversion to signed is needed */

    }

    conv_val = (int16_t)val; //is it correct way
     
  2. WBahn

    Moderator

    Mar 31, 2012
    17,748
    4,796
    No, that won't do anything. You have already limited val to be a 15-bit positive integer and 15-bit positive integers are represented the same way in a 16-bit signed or a 16-bit unsigned integer.

    How would you do it manually?

    If I told you that val=1000, what value would you plot on the graph?

    If I told you that val=29000, what value would you plot on the graph?

    If I told you val=x, what value would you plot on the graph?
     
  3. aamirali

    Thread Starter Member

    Feb 2, 2012
    415
    1
    I now conder 15000 as origin & then print values accordingly. So 30000 is +15000 on graph & 0 is -15000 on graph.

    Before printing I have to divide by constant & signed factor that why I am asking how to cnvert unsigned into signed
     
  4. RamaD

    Active Member

    Dec 4, 2009
    254
    33
    Convert to signed, as your max value of 30000 is within int16, and subtract 15000. Unsigned integers cannot hold negative numbers.
    I do not know how your graph plotting is, you could also simply plot with 0-30000, and draw the axis (zero) at 15000!
     
  5. WBahn

    Moderator

    Mar 31, 2012
    17,748
    4,796
    What constant do you think you have to divide by.

    Again, what mathematical operation do you need to perform to change 15000 to 0, 30000 to 15000, and 0 to -15000?

    uint x
    int y

    y = ???? (what mathematical expression involving x)
     
Loading...