北京儿童医院,巧用补码(怎么转化器材的补码数据?),辉夜

频道:欧洲科技 日期: 浏览:234

导读:网上关于二进制补码数据的负数都是选用取反+1进行转化,可是真的需求这么费事吗?这篇文章将让你真实了解补码!

假定一个 ADC 转化芯片的转化数据为补码办法,24 位精度。最大电压值为 0x7fffff,最小电压北京儿童医院,巧用补码(怎样转化器件的补码数据?),辉夜值为 0x800000,转化为日出十进制如下表:

先考虑简略的,了解一下什么是补码:

看 +127 的二进制 0111 1111b,再加 1 为 1000 0000b,立刻变成负数最小值 -128。假如把 1000 0000b 当作无符号常数,那么这个数便是 +128。在这个数的基础上加 1,便是 1000 0001b,当作无符号常数便是 129,可是当作有符号常数便是 -12张东健7,由于最高位为 1 center,那么必定是负数,不行能是 129。经过剖析这些数据,自己也能发现规则。

那么如何将补码转化为咱们需求的数据呢?网上许多办法对负数求原码是选用补码取反 + 1 的办法进行转化,可是真的需求这么费事吗?

先来验证一般办法的准确性:

1000 0001b 取反为 0111 1110b 再加 1 便是 0111 1111b 十进制为 +127,转化正确。由于现已判别北京儿童医院,巧用补码(怎样转化器件的补码数据?),辉夜过是负数(负数才需求转化,正数的补码便是原码)然后经过打印函数 printf 打印出来。

来看看作这些处理需求多少步:

1、首要判别正负数韵姬

2、假如是正数,不转化,假如是负数,取反后 + 1。

3、当你显现出来的时分就需求在显现前加负号才对。这样才干显现正确。

可是你有没有发现,干嘛要这么费事,已然计算机存储是用补码办法,你接纳的数据也是补码办法,直接用不就行啦。把它当成有符号的数据直接运用就行了,不论做什么句子处理也是应该是没问题的配享太庙:

if(AD_Value > -125)

{

}

else if(AD_Value > 125)

{

}

当你接纳的 AD 转化数据直接放到有符号 AD_Value 变量里边,莫非这些判别就会有问题,莫非就必须要转化才干进行其他处理?这不是多此一举嘛?直接把它当作有符号变量运用就行了。

你或许会问,机器里边是知道这是补码,我想打印显现出来的时分总的进行转化吧?如同挺有道理。那你直接用 printf 函数打印不行嘛,这个函数又不是说只能输出正数,负数也是能显现出来的,而且还能够格式化输出,比你自己写的函数好用多了吧!可是有些有项目经历的又会问:我有多个输出方位需求进行输出,比方我要在 LCD 上显现温度,我还要在串口上打出 AD 值,而 printf 函数只能重定向一个方位,这样不是还得自己写一个打印函数吗?真的是这样吗?咱们剖析以下问题

1、什么时分往广东电信什么地方进行输出咱们知道吧?

2、打印的时分能够不一起打印是吧?

3、在一个方位需求打印的时分能够略微等一等是吧?

假如这些问题的答案是必定的,那么就有办法。在需求往串口打印的时分,重定向到串口;当需求打印到 LCD 的时分,能够重定向到 LCD,怎样做,一个函数指针就能搞定的事。

设置一个函数指针,当需求打印到 LCD 的时分,将该指针指向 LCD 字符输出函数,当需求打印到串口的时分,指针指向串口字符输出函数,那么就能正确打印到相应的方位。

需求重定向的函数如下:

int fputc(int ch, FILE *f)

{

PutChar(ch); // 打印字符的解小石函数指针

return ch;

}

那么为什么要满意上面的条件北京儿童医院,巧用补码(怎样转化器件的补码数据?),辉夜呢?只要知道什么时分往什么地方输出才干修正函数指针。药师妹然后两个条件便是 printf 函数自身的约束了,京华烟云它是一个不行重入函数,在往串口打印憋尿故事的时分你就别打断它,让它又往 LCD 打印,由于这样会损坏函数,导致打印出来的东西不三不四。因而打印的时分只能往一个方位进行打印,在打印完之后才干再切换到下一个打印方位,这必然引出第三个问题的考虑。这儿能够选用锁的办法进行处理,正在打印的时分就上锁,不打印的时分就开释锁,让他人运用。

题外话说的如同比较多,持续说补码。

已然你都说不必进行转化av女优排行了,那么就没什么好说的了,可是我所说的不必转化是在数据刚好是 8bit,16bit,32bit,64bit 的状况下,这样机器就能够直接北京儿童医院,巧用补码(怎样转化器件的补码数据?),辉夜运用,可是假如 AD 转化的数据是 10bit,12bit,20bit,24bit,又该怎样办,是不是又得走上老路,按岫玉部就班的进行转化呢?假如真是这样,我就不会专门写一篇了,前面写了那么多,便是为了引出这个啦!

上面的是 24 位的状况,如同和 8bit,16bit 这些数据的补码相似,都是全为 1毕淑敏 的时分为 -1,在最大数加 1 的时分变成最小值。

怎样处理呢?一条句子就 OK!

int AD_Val北京儿童医院,巧用补码(怎样转化器件的补码数据?),辉夜ue; //这条不能算哈,但很要害

AD_Value= ((AD_Value<< 8) >> 8);

看到这一条句子是不是觉得这个人有病啊,左移完 8 位又右移 8 位,这不是闲着没事干吗?欠好意思这是我自己想出来的,我也没病。在考虑出来之前,我也上网找过办法,由于我感觉应该存在一种简略的办法进行转化的,所以想上网看看能三宝局长不能找到,假如能找北京儿童医院,巧用补码(怎样转化器件的补码数据?),辉夜到最好,实际上我没找到,网上或许也sina微博是有这个办法的,仅仅或许是我命运欠好,没找到算了。就算作是我的原创好啦!手动纯真微笑脸。别的甘旨联系运用 printf 函数进行多方打印(要点是往 LCD 打印)也是我自己突发奇想的,再加一个手动微笑脸。

好了,不扯了,再扯就晚了!

说要点,为什么这样处理就能到达咱们想要的作用呢?本来位移操作有一个特性,使用这个特性就能将 24 位的补码转化成 32 位的补码办法,不对啊,怎样仍是补码,不是说好了转化成原码啊,假如你还在纠结这个,你还没了解我前面所写的东西,再去前面看看吧,少年!真不扯了,持续这个特性:这个特性便是当有符号变量进行位移操作的时分,假如高位为 1,进行古拉琪艾丝右移时,高位补 1;假如高位为零,右移时高位补 0,这便是和无符号变量处理的不同!亲测哦亲!也便是说在进行右移的时分它现已进行了符号位的判别了,首红旗l9先通北京儿童医院,巧用补码(怎样转化器件的补码数据?),辉夜过左移 8 位,让最高位为 1 或 0,然后再右移 8 位,依据右移的特性就完成了将 24 位有符号补码值转化为 32 位有符号变量,而且这种转化是不会影响数据的巨细的。其它位数的转化同理。别的当时测验条件为 KEIL ARM 环境,其他环境不敢确保这条句子的正确性哦。

---------------------------------------------------------------------------------------------------------------------------giga5------------------2018/07/30 Osprey

热门
最新
推荐
标签