本帖最后由 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. 不知道 是否 正确,还请大侠指点 ! 非常感谢! |
正数原码、补码相同,无需转换;
负数原码可以这么计算:
原码=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,注意是负数,所有有负号)
其实这样表示和转换负数原码、补码的根源就在于,负数补码的引入把计算机中的减法运算变成了加法运算(计算机只会加法啊)。
ADS1220的转换结果是24位有符号数,模值为0x100 0000,对于补码表示的负的转换结果X,其数值可以这么计算:
0x100 0000 - X
0x80 0000对应就是:
0x100 0000 - 0x80 0000 = 0x80 0000(这个结果只是数值)
0xff ffff对应就是:
0x100 0000 - 0xff ffff = 0x00 0001(这个结果只是数值)
非常感谢大神的 精彩、耐心、信息...的回复,好激动呀,看您的回帖,就是 一种 享受,如食 干酪一般....
大神的回复,和 ADS1220的datasheet正好印证...
很简单是不是。那么你会问为什么。举一个最简单的例子,(-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用反码表示。
那通过这种方式就能统一正负数值的计算。
谢谢大侠,学习了 !