您现在所在的是:

PLC论坛

回帖:12个,阅读:1991 [上一页] [1] [2] [下一页]
* 帖子主题:

补码问题求助

22571
liuxd6909
文章数:11956
年度积分:139
历史总积分:22571
注册时间:2008/7/19
发站内信
2017国庆活动(三)
2015Indusoft体验
LOGO!体验一等奖
发表于:2017/7/10 7:49:03
#0楼
请看下例求HF0F0F0F0补码程序:

X10接通前的程序如下图:

附件 45F0F163775048F5A45DDFF95A7C975A.jpg

X10接通后的程序如下图:

附件 EE3835AB7F1D440DB47F0F00438213E2.jpg

[size=4]1、计算机里的数都以补码形式存在,既然X10接通前后都是在求原码的补码,为什么求出来的不同,前一个是-3856,而后一个却是3856呢?
2、HF0F0F0F0是一负数,求出来的补码不也应会是负数-3856吗?为什么X10接通后,求出来的补码是正数3856呢?[/size]
[此贴子已经被作者于2017/7/10 8:02:37编辑过]
思想决定高度
5758
121111115
文章数:1421
年度积分:202
历史总积分:5758
注册时间:2015/3/16
发站内信
2018论坛分享达人
发表于:2017/7/10 9:11:04
#1楼
补码好像是反码加1
785
lxlncr666
文章数:54
年度积分:50
历史总积分:785
注册时间:2017/6/3
发站内信
发表于:2017/7/10 12:08:57
#2楼
如楼上所说,补码的定义是反码加1
对于有符号数,符号位(最高位)在反码的过程中发生变换,就是正变负,负变正。
你干脆用无符号方式或者二进制方式查看不是更好,何必换算10进制
24574
mjinbao
文章数:13934
年度积分:50
历史总积分:24574
注册时间:2013/1/12
发站内信
2018春节活动(三)
2017春节活动(三)
2016国庆活动(三)
发表于:2017/7/10 13:04:19
#3楼
   用台达WPLSoft试了一下,或可如此理解:
   1. 负数在PLC内用其补码存放(二进制),将HF0F0F0F0送到D11D10后,则D11、D10分别为HF0F0、HF0F0(16位二进制数);而HF0F0(B11110000 11110000)最高位是1,所以是负数。
   因此,查看到的十进制数-3856,其二进制补码就是HF0F0;3856的二进制数B00001111 00010000取反,得B1111000011101111,加1,得B1111000011110000(HF0F0),即-3856的补码。
   2. 而NEG指令求得的结果,是符号位相反了,可能不是我们理解意义上的求补码;或者,负数去掉符号位再求。
   (现在才发觉,如何求补码,不大记得了,不知符号是如何考虑的;以上只是通过程序仿真结果,反推过来的)
[此贴子已经被作者于2017/7/10 13:06:39编辑过]
19765
pqsh 版主
文章数:7487
年度积分:381
历史总积分:19765
注册时间:2006/8/22
发站内信
2018论坛解答高手
发表于:2017/7/10 16:30:10
#4楼
是你想错了。转不过弯。补码不是原数。
负数的意思就是这样来理解:
假如最高位是1,那这个数就是负数,这是符号位,保留-号。
然后补码表示负多少。
F0F0表示负数,保留最高位为负号-,剩下的取反加1,等于F10(3856),表示这个数是-3856.
F0F0表示-3856(负数的表达方法),你已经计算补码了,怎么还会是原数呢?
如果我忘了我
请帮忙记得我
pqsh@163,326199298@v&q同号
22571
liuxd6909
文章数:11956
年度积分:139
历史总积分:22571
注册时间:2008/7/19
发站内信
2017国庆活动(三)
2015Indusoft体验
LOGO!体验一等奖
发表于:2017/7/10 21:57:02
#5楼
有点乱,现在只用DNEGP指令对32位D10求补码操作。
X10接通前的程序如下图:

附件 4D39ECBE16BF4F75A48F5915D6C9230A.jpg

在上面程序中原码HF0F0F0F0是以补码形式显示的,它是一个负数,所以它显示-252645136。

在X10接通后,可以看到所求补码为252645136,它是一个正数,如下图所示:

附件 C095A5FE30AC4936BD85805BCECB8851.jpg
[此贴子已经被作者于2017/7/10 21:58:34编辑过]
思想决定高度
22571
liuxd6909
文章数:11956
年度积分:139
历史总积分:22571
注册时间:2008/7/19
发站内信
2017国庆活动(三)
2015Indusoft体验
LOGO!体验一等奖
发表于:2017/7/10 22:20:00
#6楼
下面不用NEG指令,而用取反加1指令进行求补码操作 。
X10接通前的程序如下图所示。
附件 4FA9580CAF89493894254C6797D69E28.jpg
X10接通后的求补码程序如下图所示。

附件 BEFC52E49FF54AF3BFCE05ACB08B840E.jpg

看来这个用取反加1指令求补码的程序运行结果和用NEG求补码指令求补码操作所得到的结果是一样的。
思想决定高度
24574
mjinbao
文章数:13934
年度积分:50
历史总积分:24574
注册时间:2013/1/12
发站内信
2018春节活动(三)
2017春节活动(三)
2016国庆活动(三)
发表于:2017/7/11 13:17:32
#7楼
当把HF0F0F0F0存入D11D10时,机器就认为它是补码了;其原码是-0F0F0F10(K-252645136)。
可以将K-252645136存入,不作运算时,查看其补码。

负数以补码形式存放,只要是最高位为1的二进制数,就认为是补码。
至于求补指令的意义,台达指令的说明是“本指令可将负数的BIN值转换成绝对值”(编程软件自带的指令“索引”)。
+5
此帖发自手机工控论坛
22571
liuxd6909
文章数:11956
年度积分:139
历史总积分:22571
注册时间:2008/7/19
发站内信
2017国庆活动(三)
2015Indusoft体验
LOGO!体验一等奖
发表于:2017/7/11 23:14:20
#8楼
补码HF0F0F0F0,其原码为H8F0F0F10(-252645136),它的最高位表示它是一个负数,是一个用补码表示的负数 。若要得到一个负二进制补码的数值,需要对其补码全部按位取反,然后再末位加1,得到H0F0F0F10(252645136)。这个求补过程应该可理解为求补码的绝对值的过程 .
[此贴子已经被作者于2017/7/12 7:51:32编辑过]
思想决定高度
24574
mjinbao
文章数:13934
年度积分:50
历史总积分:24574
注册时间:2013/1/12
发站内信
2018春节活动(三)
2017春节活动(三)
2016国庆活动(三)
发表于:2017/7/12 12:25:07
#9楼
   谢谢赏分表情

   有时也可以是这样,比如:
   原码、反码、补码的概念,归其概念;NEG指令的功能,归其功能。两者先分开来,需要时再看其联系(或有无联系)。

   至于指令的名称,字面意义觉得不怎么落实的、就不去落实其字面意义;就如脑白金的“年轻态”,不是吃了就一定会年轻态,而只是其产品的一个标志。
   若是为了便于记忆而理解,或许其名称求补码,可以认为是“对补码求”;时间一久,习以为常后,也就不需要解释了。

   但这种思维方式,不一定人人适合;因为,每个人都可能有自己的思维特点。
   有时,看不懂他人的东东,有可能是因为未适应其思维。

关于我们 | 联系我们 | 广告服务 | 本站动态 | 友情链接 | 法律声明 | 非法和不良信息举报

工控网客服热线:0755-86369299
版权所有 工控网 Copyright©2025 Gkong.com, All Rights Reserved

78.0005