myfocus-2048857 发表于 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.

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



zhoupxa 发表于 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,注意是负数,所有有负号)

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

zhoupxa 发表于 2016-11-28 14:27:11

楼主的减1取反也未尝不可,貌似楼主计算有误。

zhoupxa 发表于 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(这个结果只是数值)

myfocus-2048857 发表于 2016-11-28 16:39:35

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

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

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


watershade 发表于 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用反码表示。

那通过这种方式就能统一正负数值的计算。

myfocus-2048857 发表于 2016-12-1 17:14:45

watershade 发表于 2016-11-28 23:01
反码求解的确会把人搞迷。8位机和32位机的补码就一样。当然你的24位也不一样。我们不妨说是N位计算系统,那 ...

谢谢大侠,学习了 !

asssdz-382474 发表于 2016-12-1 17:59:07

:):):):):):):):)
页: [1]
查看完整版本: 知道 补码,如何 计算 原码 ?