完善资料让更多小伙伴认识你,还能领取20积分哦, 立即完善>
|
|
相关推荐
1个回答
|
|
我们在使用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类型变量中,方便后续对这个有符号整数进行其他处理。 |
|
|
|
只有小组成员才能发言,加入小组>>
3278 浏览 9 评论
2951 浏览 16 评论
3455 浏览 1 评论
8984 浏览 16 评论
4045 浏览 18 评论
1097浏览 3评论
567浏览 2评论
const uint16_t Tab[10]={0}; const uint16_t *p; p = Tab;//报错是怎么回事?
564浏览 2评论
用NUC131单片机UART3作为打印口,但printf没有输出东西是什么原因?
2299浏览 2评论
NUC980DK61YC启动随机性出现Err-DDR是为什么?
1855浏览 2评论
小黑屋| 手机版| Archiver| 电子发烧友 ( 湘ICP备2023018690号 )
GMT+8, 2024-11-20 21:23 , Processed in 1.129076 second(s), Total 77, Slave 58 queries .
Powered by 电子发烧友网
© 2015 bbs.elecfans.com
关注我们的微信
下载发烧友APP
电子发烧友观察
版权所有 © 湖南华秋数字科技有限公司
电子发烧友 (电路图) 湘公网安备 43011202000918 号 电信与信息服务业务经营许可证:合字B2-20210191 工商网监 湘ICP备2023018690号