我们在使用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位不是相当于什么也没做吗?那么你没明白C语言中右移运算符的含义,可以参考我的另一篇博客https://blog.csdn.net/weixin_44509533/article/details/109080809
左移8位使得24位数据的最高位(符号位)移动到了rawValue的最高位上,而由于int类型是有符号类型,在用右移运算符进行运算时,实际上是进行算术右移,而算术右移能够保持符号位不变,因此实现了符号位的扩展,最终的效果是rawValue的值与24bit补码数据的值相等,而通过这一操作,我们将24bit补码数据装载进了一个int类型变量中,方便后续对这个有符号整数进行其他处理。

将24位(任意位数)补码转换成有符号整数的方法相关推荐

  1. 任意进制转换成十进制间互化(ASCII码法)(C/C++)

    目录 1 最早的版本(C) 2  针对上面的问题进行改进(C++) 2.1  任意进制转换成十进制(运用字符串) 2.2  十进制转换成任意进制(运用数组逆序存储+取模作除法) 3  ASCII码参考 ...

  2. linux 串口 字符 间隔,嵌入式linux编程过成中模块从串口读数需要特定的字符段并且需要每两位字符数组元素转换成一个16进制数(提取特定字符串+字符串转16进制)...

    嵌入式linux编程过成中用到zigbee模块 zigbee从串口读数需要特定的字符段并且需要每两位字符数组元素转换成一个16进制数 (提取特定字符串+字符串转16进制) #include #incl ...

  3. excel表格中18位身份证号码如何转换成出生日期

    1.获取出生日期,如果Excel表上,如果A1为身份证号码. =IF(LEN(A1)=15,MID(A1,7,2)&"-"&MID(A1,9,2)&&quo ...

  4. 嵌入式linux编程过成中模块从串口读数需要特定的字符段并且需要每两位字符数组元素转换成一个16进制数(提取特定字符串+字符串转16进制)

    嵌入式linux编程过成中用到zigbee模块 zigbee从串口读数需要特定的字符段并且需要每两位字符数组元素转换成一个16进制数 (提取特定字符串+字符串转16进制) #include<st ...

  5. java如何把png转换成jpg_Java实现将png格式图片转换成jpg格式图片的方法【测试可用】...

    Java实现将png格式图片转换成jpg格式图片的方法[测试可用] 发布于 2020-4-9| 复制链接 摘记: 本文实例讲述了Java实现将png格式图片转换成jpg格式图片的方法.分享给大家供大家 ...

  6. python修改文件格式为jpg_python将.ppm格式图片转换成.jpg格式文件的方法

    python将.ppm格式图片转换成.jpg格式文件的方法 将.ppm格式的图片转换成.jpg格式的图像,除了通过软件转换,还可以使用python脚本直接转换,so easy!!! from PIL ...

  7. php 字符串转化为16进制,php将字符串转换成16进制的方法

    php将字符串转换成16进制的方法 本文实例讲述了php将字符串转换成16进制的方法.分享给大家供大家参考.具体分析如下: php中可以通过bin2hex函数将字符串转换成16进制的形式输出,bin2 ...

  8. 十进制转换成二进制和十六进制的方法

    十进制转换成二进制和十六进制的方法 十进制数转换成二进制数-般分为两个步骤,即整数部分的转换和小数部分的转换. (1 )整数部分的转换 *除2取余法:*这种方法是由于D10=N2 =dn-1x2n-1 ...

  9. pdf英文转换成html网页,PDF文件转换成html网页文件小方法

    原标题:PDF文件转换成html网页文件小方法 现在不知道大家知不知道小学已经开设编程课程了.我记得我们小时候连上个微机课都是一种奢望,所以现在的孩纸还是很享福的呀.但是很多的小白估计听着代码.编程这 ...

最新文章

  1. 洛谷P4053 [JSOI2007]建筑抢修
  2. 程序升级触发阿里云自身安全机制导致的莫名问题
  3. 140个Google面试问题
  4. python获取文件字节数_python关于文件操作中的字符个数和字节数
  5. 用ul li实现边框重合并附带鼠标经过效果
  6. arduino byte转string_Java数组转List集合的三驾马车
  7. 【零基础学习iOS开发】【02-C语言】05-进制
  8. 恒企自考_致自考生:想自考的人千千万万,遇到的困难却千篇一律
  9. 白鹭引擎增加点击事件实例
  10. MySQL优化(三):优化数据库对象
  11. 查找单词个数案列实现(字符串流)
  12. 移动端300ms延迟_移动端300ms延迟的解决方法
  13. 逻辑卷(lvm)的配置与管理
  14. 基于PPGiPPG的心率检测原理
  15. vue导入excel进度条_vue中使用excel导入导出
  16. Matplotlib-散点图详解
  17. 下载较旧版本的VS visual studio
  18. “羊毛党”们最喜欢用的手机号码分析
  19. 线性判别分析(LDA),二次判别分析(QDA)和正则判别分析(RDA)
  20. 5个强盗分100颗宝石

热门文章

  1. 一维黎曼c语言,一维黎曼问题数值解及计算程序.docx
  2. 回归方程的显著性检验——F检验
  3. 2022前端应该掌握的10个 JS 小技巧
  4. 中国红客联盟-,显示的是此网站存在漏洞,请及时修复…
  5. android 背景磨砂效果,跨浏览器磨砂效果背景图片模糊特效
  6. phalcon 配置
  7. 共享产品方案——扫码充电器整体方案
  8. cad面积累计lisp怎么用_cad中面积及重量、长度及等分、长度及总长、导出文字、数字编号等lisp应用...
  9. L05_用pytorch实现线性回归
  10. 四川师范大学遥感导论(1-绪论)90分以上版本