单片机学习小组
直播中

1653339509.516700

11年用户 479经验值
私信 关注

怎样把AD转换得到的补码转换成一个有符号的整数呢

怎样把这些AD转换得到的补码转换成一个有符号的整数存放在一个有符号变量中呢?

回帖(1)

颜小玲

2022-2-25 14:38:34
我们在使用ADC的时候可能会遇到AD转换结果以24bit、12bit、10bit或诸如此类的补码形式输出,而计算机或单片机中,变量类型大多是8bit、16bit、32bit的。那该怎样把这些AD转换得到的补码转换成一个有符号的整数存放在一个有符号变量中呢?
由于有符号的数在计算机中本来就是以补码形式进行存放,因此不需要进行码制的转换,有一个简单的小技巧可以实现这种功能。
先来看一个例子:
假设有一个5bit的有符号数10011(补码),最高位的1是符号位,这个数的值是-13。而单片机或计算机中并没有5位的变量,我们希望能够用一个8位的有符号(char)变量来存放这5位的数,并且不希望改变这个数的大小。那么将这5位数据存放到char型变量的最低5位时,必然会产生3位的空位。对于有符号数来说,进行符号位的扩充可以在不改变数据大小的同时,将这剩余的3个空位填满。对于10011(-13),我们将符号位1进行扩展,得到111 10011,它仍然是-13的补码。对于一个正数,例如00011(正3),对符号位0进行扩展,得到000 00011,它仍然是正3的补码。这也就说明:
将任意位数的数据,存放在变量的低位,而空余的高位进行符号位扩展,就可以在不改变数据本身大小的情况下,实现将任意位数的数据存放到一个char、short int或int类型的变量中,使之可以被计算机解读成一个有符号的整数
那么剩下的问题是,在单片机和计算机中怎么实现符号位的扩展呢?下面举例说明:
假设我们有一个24bit的补码数据,要将其存放至int类型变量中。
我们定义了:

int rawValue

然后将这24bit,存放至rawValue的低24位中,那么要进行符号扩展,可以用以下代码实现:

rawValue= ((rawValue<< 8) >> 8);

有人会说左移8位再右移8位不是相当于什么也没做吗?
左移8位使得24位数据的最高位(符号位)移动到了rawValue的最高位上,而由于int类型是有符号类型,在用右移运算符进行运算时,实际上是进行算术右移,而算术右移能够保持符号位不变,因此实现了符号位的扩展,最终的效果是rawValue的值与24bit补码数据的值相等,而通过这一操作,我们将24bit补码数据装载进了一个int类型变量中,方便后续对这个有符号整数进行其他处理。
举报

更多回帖

发帖
×
20
完善资料,
赚取积分