你的浏览器版本过低,可能导致网站不能正常访问!
为了你能正常使用网站功能,请使用这些浏览器。

查看: 3631|回复: 7

知道 补码,如何 计算 原码 ?

[复制链接]

57

主题

403

回帖

0

蝴蝶豆

金牌会员

最后登录
2020-7-15
发表于 2016-11-28 11:44:53 | 显示全部楼层 |阅读模式
本帖最后由 myfocus-2048857 于 2016-11-28 11:47 编辑

ADS1220给出的转换结果是 补码形式,为了 计算 输入的模拟量大小,需要 转换为原码。

请教:
知道 补码,如何 计算 原码 ?

如 补码为0x80 0000h,原码如何计算 ?
我的思路是:用原码 转 补码 的逆运算(减1,然后 再各位取反)。
按照上面的思路 计算:
0x80 0000H的原码为:0000 0000 0000 0000 0000 0000;
0xFF FFFFH的原码为:1000 0000 0000 0000 0000 0001.

不知道 是否 正确,还请大侠指点 !
非常感谢!



<
回复

使用道具 举报

5

主题

1584

回帖

11

蝴蝶豆

论坛元老

最后登录
2020-12-8
发表于 2016-11-28 14:04:34 | 显示全部楼层
本帖最后由 zhoupxa 于 2016-11-28 14:33 编辑

正数原码、补码相同,无需转换;
负数原码可以这么计算:
原码=0-补码=-补码(当然,补码=0-原码=-原码),这里的0取数据字长所能表示的最大正数加1,也就是模值。
其实就是取负,由于自然溢出,和取反加1一个效果。

比如对于8位有符号数来说:
模为256,负数范围从-128到-1。

-1的补码就是0xff(256-1)
-2的补码就是0xfe(256-2)
......
-127的补码就是0x81(256-127)
-128的补码就是0x80(256-128)
同样,知道补码求原码:

0xff的原码就是-1(256-0xff,注意是负数,所有有负号)
0xfe的原码就是-2(256-0xfe,注意是负数,所有有负号)
......
0x81的原码就是-127(256-0x81,注意是负数,所有有负号)
0x80的原码就是-128(256-0x80,注意是负数,所有有负号)

其实这样表示和转换负数原码、补码的根源就在于,负数补码的引入把计算机中的减法运算变成了加法运算(计算机只会加法啊)。
回复 支持 1 反对 0

使用道具 举报

5

主题

1584

回帖

11

蝴蝶豆

论坛元老

最后登录
2020-12-8
发表于 2016-11-28 14:27:11 | 显示全部楼层
楼主的减1取反也未尝不可,貌似楼主计算有误。
回复 支持 1 反对 0

使用道具 举报

5

主题

1584

回帖

11

蝴蝶豆

论坛元老

最后登录
2020-12-8
发表于 2016-11-28 14:21:55 | 显示全部楼层
本帖最后由 zhoupxa 于 2016-11-28 14:25 编辑

ADS1220的转换结果是24位有符号数,模值为0x100 0000,对于补码表示的负的转换结果X,其数值可以这么计算:
0x100 0000 - X

0x80 0000对应就是:
0x100 0000 - 0x80 0000 = 0x80 0000(这个结果只是数值)
0xff ffff对应就是:
0x100 0000 - 0xff ffff = 0x00 0001(这个结果只是数值)
回复 支持 1 反对 0

使用道具 举报

57

主题

403

回帖

0

蝴蝶豆

金牌会员

最后登录
2020-7-15
 楼主| 发表于 2016-11-28 16:39:35 | 显示全部楼层
zhoupxa 发表于 2016-11-28 14:21
ADS1220的转换结果是24位有符号数,模值为0x100 0000,对于补码表示的负的转换结果X,其数值可以这么计算: ...

非常感谢大神的 精彩、耐心、信息...的回复,好激动呀,看您的回帖,就是 一种 享受,如食 干酪一般....

大神的回复,和 ADS1220的datasheet正好印证...

无标题.png
回复 支持 反对

使用道具 举报

50

主题

1057

回帖

67

蝴蝶豆

论坛元老

最后登录
2020-12-2
发表于 2016-11-28 23:01:17 | 显示全部楼层
反码求解的确会把人搞迷。8位机和32位机的补码就一样。当然你的24位也不一样。我们不妨说是N位计算系统,那X 的补码就是2^N - X。
很简单是不是。那么你会问为什么。举一个最简单的例子,(-5) + 5 应该是多少?我们假定系统是8位运算系统。-5怎么表示呐,就是2^8 - 5, 5还是5.两者加起来就是 2^8.因为计算溢出,剩下的结果就是0.同样的举一个随便的例子比如10 + (-100) 计算时候就是100 + (2^8 - 10) = 2^8 + (10-100) = 2^8 - 90 结果就是-90用反码表示。

那通过这种方式就能统一正负数值的计算。
回复 支持 反对

使用道具 举报

57

主题

403

回帖

0

蝴蝶豆

金牌会员

最后登录
2020-7-15
 楼主| 发表于 2016-12-1 17:14:45 | 显示全部楼层
watershade 发表于 2016-11-28 23:01
反码求解的确会把人搞迷。8位机和32位机的补码就一样。当然你的24位也不一样。我们不妨说是N位计算系统,那 ...

谢谢大侠,学习了 !
回复 支持 反对

使用道具 举报

13

主题

695

回帖

0

蝴蝶豆

金牌会员

最后登录
2020-6-7
发表于 2016-12-1 17:59:07 | 显示全部楼层
回复 支持 反对

使用道具 举报

关于
我们是谁
投资者关系
意法半导体可持续发展举措
创新与技术
意法半导体官网
联系我们
联系ST分支机构
寻找销售人员和分销渠道
社区
媒体中心
活动与培训
隐私策略
隐私策略
Cookies管理
行使您的权利
官方最新发布
STM32N6 AI生态系统
STM32MCU,MPU高性能GUI
ST ACEPACK电源模块
意法半导体生物传感器
STM32Cube扩展软件包
关注我们
st-img 微信公众号
st-img 手机版