第一种方法,采用位操作
/* 描述: 将无符号数的编码按有符号数解析,用于解析以有符号数格式编码但又不是8位,16位,32位对齐的数。 */
/* 解析完的数是32位有符号数。 */
/* 输入: */
/* uint32_t data: 信号的原始值,二进制编码 */
/* uint8_t n : 信号的bit_length, 要转换的有符号数是多少位的 */
/* 返回值: */
/* int32_t 类型, 解析完成的带有正负号的信号值。 */
/* 注意: n最大为32,最小为2。 */
int32_t singed_data_decode(uint32_t data,uint8_t n)
{
int32_t ret;
uint32_t bit_mask = 1 << (n-1);
if(data & bit_mask) // 判断符号位
{
ret = (int32_t)(data | (~(bit_mask - 1))); // 这一步求出就是负数的补码
}
else
{
ret = (int32_t)data;
}
return ret;
}
第二种方法,采用数值运算
/* 描述: 将无符号数的编码按有符号数解析,用于解析以有符号数格式编码但又不是8位,16位,32位对齐的数。 */
/* 解析完的数是32位有符号数。 */
/* 输入: */
/* uint32_t data: 信号的原始值,二进制编码 */
/* uint8_t n : 信号的bit_length, 要转换的有符号数是多少位的 */
/* 返回值: */
/* int32_t 类型, 解析完成的带有正负号的信号值。 */
/* 注意: n最大为32,最小为2。 */
int32_t singed_data_decode(uint32_t data,uint8_t n)
{
int32_t ret;
uint32_t bit_mask = 1 << (n-1);
if(data & bit_mask) // 判断符号位
{
ret = (-1) * ((int32_t)((bit_mask << 1)-data)); // -1 乘以负数的绝对值,得到负数的最终结果
}
else
{
ret = data;
}
return ret;
}