电能芯片寄存器为何是24位有符号数据
因为ADC精度。我们需要用到ADC转换,常见的ADC精度有 24、12、10bit类型,且转换出的数据是补码形式。
如何将24位补码转换成有符号整型
计算机或单片机中,变量类型大多是8bit、16bit、32bit的。那该怎样把这些AD转换得到的补码转换成一个有符号的整数存放在一个有符号变量中呢?
计算机中数据本身就是补码存储,因此不需要强制转换。具体实现方法如下:
-
先举个简单的例子,转换1个5位类型的有符号数10011(-13),最高位1为符号位。
5位源码 十进制值 8位类型char结果 1 0011 -13 1111 0011 0 0011 3 0000 0011 0 1101 13 0000 1011 上表可见,将5位类型数据直接存放在char类型的低位,剩余的高位用符号位扩展即可完成转换,前后值不变,可用于计算机直接参与运算。C语言具体算法,可用逻辑运算符实现。
/* 将32位以内位数的的数据转换为32位有符号类型 参数:val--要转换的原始数据; bits--原数据的位数 返回:32位有符号数,转换的结果 */ int32_t tran_to_int32(int32_t val, uint32_t bits) { val <<=(32-bits); //将符号位左移到最高位,val已经和原数据符号一致 val >>=(bits); //右移,实现了符号为扩展,即将原数据的空余高位全部用符号位填充 return val; } void main(void) { int32_t in24Val1,in24Val2; in24Val1 = 0x007F; in24Val2 = 0x107F; tran_to_int32(in24Val1 , 24); tran_to_int32(in24Val2 , 24); }
总结
将任意n位数的数据,存放在变量的低位,而空余的高位进行符号位扩展,就可以在不改变数据本身大小的情况下,实现将任意位数的数据存放到一个char、short int或int类型的变量中,使之可以被计算机解读成一个有符号的整数。
————————————————
版权声明:本文为CSDN博主「星水天河」的原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接及本声明。
[原文链接](将24位(任意位数)补码转换成有符号整数的方法_星水天河的博客-CSDN博客_24位补码