# printf with 2's compliment

Question asked by jargin.matt on Jul 13, 2013
Latest reply on Jul 13, 2013 by Clive One
I ported the printf functions to UART3. I am reading some gyro data from a digital chip that gives it's results in 2's compliment. So I get the raw data and print the integer that I stored it in. But the printf function is not converting to a decimal number, so I never get negative numbers.

So I have to convert it manually with the code below. the printf statement I use is printf("%f",data); why does it not see that the integer is negative and just print an unsigned value?

For example: 0xFFFF = -1 in 2's compliment. But the printf will print 65535.

<code>
float get_gyro(char axis)   //Get the gyro data at that axis in degrees/sec
{
unsigned int high;     //I have changed these to a signed int and had the same results
unsigned int low;
int data = 0;
float dps = 0;
float offset = 0x00;

switch(axis)
{

case 'x':
data = (low | (high<<8));          //Put high and low bytes into one 16 bit number
offset = gyro_x_offset;
break;
case 'y':
data = (low | (high<<8));
offset = gyro_y_offset;
break;
case 'z':
data = (low | (high<<8));
offset = gyro_z_offset;
break;
default:
break;

}

/****
For some reason printf does not do convertion of 2's complement.
This data will always be a 16 bit number from the gyro
****/
if(data&0x8000)//If its a negative number
{
data = ((data ^ 0xFFFF) +1)*-1; //Convert From 2's Comp to Decimal
}

if(data < 0)
{
data = data + offset;
}else{
data = data - offset;
}

dps = data*gyro_sens;

return (dps);
}

</code>