⑴ 关于三菱plc 求补指令 二进制补码转换
您说的“如果为正数 就不变,如果是负数,……”,
这话不是“补码”一词的定义。这是有符号算术数的“补码表示法”。
“补码”一词有两种用法,意思有所不同。
一个含义是:两个机器代码互为“补码”。定义是:
如果两个机器码的“机器相加”结果是0,就称这两个机器码互为“补码”。
在采取第一个含义时,为了和下面的另一个含义区分,有时将这个含义的“补码”一语叫做“机器补码”。
另一个含义是:有符号算术数的“补码表示法”。这就是你上面说的了。
符号算术数的“补码表示法”定义是:
如果这个算术数是正数,就用这个数本身的二进制代码作为这个数的机器码;如果这个算术数是负数,就用这个数的绝对值的机器码的“机器补码”作为这个负数的机器码。这种表示方法称作“补码表示法”。
采用“补码表示法”时,只要原数值不超出“溢出”的界限,那么,机器码的二进制位的最高位就可以看作符号位。
根据上述规定,可以知道,如果两个有符号数绝对值相等符号相反,那么,他们的“补码表示法”的机器码,一定是互为“机器补码”了。
所以,对机器码执行“机器求补”的操作,恰好相当于对原算术数“乘以负一”。也就是您说的“绝对值不变的变号操作”。
至于您说的“取反加一”,那就是“机器补码”的求法。
既然互为补码的两个码机器和为零,而互为反码的两个机器码的和为“全1码”,而“全1码”再加1,机器加法最高进位丢掉,就成了“全零码”,当然“取反加一”就是“机器补码”了。
计算机的“求补”指令,既是“求机器补码”,又等于是有符号数乘以负一。
另外,再顺便指出:上面说的“机器求补”,是整个代码求补,并不需要对“符号位”单独处理。只要数值本身不溢出,那么按上述规则得到的机器码符号位就正好符合正0负1的规则。
⑵ 什么是原码 补码 反码
有符号数,有三种表示方法,即原码、反码和补码。
在计算机系统中,数值一律用补码来表示和存储。
在计算机系统中,原码和反码,都是不存在的。
==================
数值 0,在八位机中,就是 0000 0000。
+1,就是加上一,即为:0000 0001。
+2,就再加上一,即为:0000 0010。
其他正数,依次递增即可。。。
最后的是+127,即为:0111 1111。
以上这些,就是正数的补码。
----------
负数,就是从 0 往下减。
-1 就是 0000 0000-1,取八位的结果,
那么,-1 就是:1111 1111 = 255(十进制)。
同理,-2 就是:1111 1110 = 254。
其他负数,依次递减即可。。。
最后的是-128,即为:1000 0000 = 128。
以上,就是数值,存在计算机中的补码。
求负数的补码,计算公式是:【 256 + 这个负数 】。
如果需要二进制,就自己变换吧。
==================
十进制数的运算,有个特点,看下面的算式:
25 - 1 = 24
25 + 99 = (一百) 24
忽略进位,这两种算法,就具有相同的功能。
因此,99,就是-1 的补数。
在二进制时,255 就是-1 的补码。
==================
借助于补码,就可以把减法,转换成加法运算。
这就可以:简化计算机的硬件。
如,减法运算:59-31 = 28。
在计算机中,用补码的加法运算如下:
59 的补码=0011 1011
-31 的补码=1110 0001
-相加-------------
得:(1) 0001 1100= 28 的补码
忽略进位,只保留八位,结果就完全正确。
这就实现了减法运算。
原码和反码,都没有这种功能。
所以,计算机中,根本就没有原码和反码。
⑶ 什么是原码、反码、补码
在计算机系统中,数值,一律用补码表示和存储。
计算机中,并没有原码和反码。
为什么用补码?
就是为了:简化硬件,节约成本。
因为,负数,是可以用一个正数(补码)代替的。
如:24 - 1 = 23
24 + 99 = (一百) 23
忽略进位,用 +99 就可以代替-1。
+99,就是-1 的补数。计算机用二进制,就称为:补码。
用补码(正数)代替了负数,那么,计算机中,就没有负数了。
那么,在计算机中,就只有加法运算了。
所以,在计算机中,只需设置一个加法器,便可加减通吃了。
-------------
定点整数的补码(mod=2^n)定义式如下:
[X]补 = X( 0 ≤ X < 2^(n-1) )
[X]补 = 2^n - | X |(-2^(n-1) ≤ X < 0 )
当 n = 8 时,[-128]补 = 256-128 = 1000 0000B。
-------------
定点小数的补码(mod=2)定义式如下:
[X]补 = X( 0 ≤ X < 1 )
[X]补 = 2 + X (-1 ≤ X < 0 )
因此,-1.0 的补码为 2 +(-1) = 1.0000。
-------------
⑷ 原码 反码 补码
说到二进制补码,大家都知道:有符号数的负数的补码是 其正数的反码+1,例如 10001111 的补码是反码01110000 加 1 =01110001 ,很多书都这么说,可是为什么这样计算的结果就是它的补码?为什么要用补码?很多书要么不解释,要么就是说:这是因为在计算机内补码计算最快。(其实是补码计算指令的CPU设计更容易实现) 最初我看的书,《大学计算机基础教程》(我非计算机专业),这破书说不清,道不明,给与我非常严重负面的影响,以至于我在以后的计算机学习过程中,程序设计中遇到大大小小不少麻烦和迷茫。
在某些计算机组成原理书上提到:其实补码的计算原理,是用一个模来减去无符号的正数部分。譬如时钟,12点之后是13点,但是时钟上没有13点怎么办?就用13减去12=1点。这个模是12.可惜这个比喻并不是很好。
请看 一个字节长的无符号数的表示范围 :0~255,有符号数的表示范围:-128~127 , 注意,这个表示范围的写法极有可能影响我们的思维,从而导致错误。我们应该这样来写:0~127 ~ -128 ~ -1 ,这才是较好的写法。为什么?因为这个写法的数的顺序与0~255 一一对应。
由上,我们了解,其实补码不过是用128 ~ 255 这段范围的数来表示 ~128 ~ -1这段范围的负数。那么我们就可以凭自己,而不是看教材,就可以推测出计算补码的公式,就是:256-欲求的负数的绝对值= 此负数的补码。
没错,就是这么简单的东西,可是却困扰了很多人。可见有个好的教材是多么的重要。
至于前面 “负数的补码是 其正数的反码+1” , 极为垃圾的教材才会把这个计算方法作为初始方法来教。因为这个计算方法屏蔽了补码的计算原理。其实这不过是 “256 - 欲求的负数的绝对值 = 此负数的补码”的一个比较取巧的计算方法而已。请看 256=1 0000 0000 =1111 1111+1,而 1111 1111减任何二进制数的结果就是把这个数取反,那么 256 - 某二进制数A 既是:将 A取反 +1
以上:完毕!
注:所有讨论均在字节长范围内(8bit) 进行
⑸ 欧姆龙plc单字求补码指令什么意思
NEG指令:十六进制补码
eg:
NEG
D0000
D0010
其中D0000=#FEDC=1111
1110
1101
1100
反码为0000
0001
0010
0011
补码=反码+1
补码为0000
0001
0010
0100=#0124
因此D0010=#0124
望采纳。。。。
⑹ 西门子PLC INV_I指令对一个正数求反,怎么变成负数了 而计算机中的一个正数的原码补码反码不都是一样吗
你说的应该是INV_W指令。求反就是说对各位取反,包括符号位。一个字的最高位为0表示整数;为1表示负数。因此你一个整数取反肯定是负数啊。他的那个帮助说是取补,不过我试过应该是那个帮助文档错了,你可以打他们的客服电话问一下400 810 4288.理论上来说正数的原码补码反码一样。我猜测他这个指令都是放在逻辑指令里,应该只是单纯的取反操作,而不是乘以-1的效果(想要取补达到乘以-1的效果直接用乘法指令就好了),可能是翻译的问题。
⑺ 西门子PLC中,取反指令NOT是什么意思最近在研究PLC。
取反,是Java使用补码来表示二进制数,在补码表示中,最高位为符号位,正数的符号位为0,负数为1。
NOT,是汇编指令里逻辑运算符号:NOT表示取反的意思。
补码的规定如下:
对正数来说,最高位为0,其余各位代表数值本身(以二进制表示),如+42的补码为00101010。
对负数而言,把该数绝对值的补码按位取反,然后对整个数加1,即得该数的补码。
如-42的补码为11010110(00101010按位取反11010101+1即11010110)。
用补码来表示数,0的补码是单一的,都为00000000。(而在原码,反码表示中,+0和-0的表示是不单一的,可参见相应的书籍)。
而且可以用111111表示-1的补(这也是补码与原码和反码的区别)。
(7)plc源码补码反码扩展阅读:
运算方法:
1、正数取反:
先将初始数值转换成二进制数,再对二进制数的每一位(包括第一位的符号位)进行运算:
即将0变为1、将1变为0。得到的是最终结果的补码,要转换为最终结果的原码则需再次取补码,就能得到计算结果。
2、负数取反:
先将初始数值转换成二进制数,再取得二进制数的补码,之后对补码的每一位(包括第一位的符号位)进行运算:即将0变为1、将1变为0。
得到的是最终结果的补码(到达这一步后所得的二进制数为正数,由于正数的原码、反码、补码相同,后面的运算可以忽略。
视此步得到的为最终结果的二进制数),要转换为最终结果的原码则需再次取补码,就能得到计算结果。
常见相关指令:
AND 与运算
or 或运算
XOR 异或运算
NOT 取反
TEST 测试(两操作数作与运算,仅修改标志位,不回送结果)
SHL 逻辑左移
SAL 算术左移(=SHL)
SHR 逻辑右移( 每位右移, 低位进 CF, 高位补 0)
SAR 算术右移(每位右移, 低位进 CF, 高位不变)
ROL 循环左移
ROR 循环右移
RCL 通过进位的循环左移
RCR 通过进位的循环右移
⑻ 关于plc指令
最起码的基本指令要会,功能指令最好看得越多以后越有用,还有PLC的功能模块也要学习(当然如果你有条件或愿意学的话).总之看你的态度了,多学无害.附指令表希望对你有用
三菱FX2N应用指令集
程序流程应用指令
1、FNC(CJ) 跳转指令
2、FNC01 FNC02 FNC06(CALL SRET FEND) 调用子程序
3、FNC03 FNC04 FNC05(IRET EI DI)中断处理
4、FNC07(WDT)看门狗定时器
5、FNC08 FNC09(FOR NEXT)程序循环
数据传送、区域比较应用指令
1、FNC10(CMP) 比较
2、FNC11(ZCP)区域比较
3、FNC12(MOV) 传送应用指令
4、FNC13 (SMOV)数据移位应用指令
5、FNC14(CML)数据反相传送应用指令
6、FNC15 (BMOV) 成批传送
7、FNC16 (FMOV) 多点传送应用指令
8、FNC17 (XCHP) 数据交换
9、FNC18(BCD) 将BIN转换为BCD
10、FNC19(BIN) 将BCK转换为BIN
四则运算逻辑应用指令
1、FNC20(ADD) 加法应用指令
2、FNC21(SUB) 减法
3、FNC22(MUL) 二进制乘法
4、FNC23(DIV) 二进制除法
5、FNC24(INC) 增加
6、FNC25(DEC) 减少
7、FNC26(WAND) 逻辑与
8、FNC27(WOR) 逻辑或
9、FNC28(WXOR) 二进制互斥逻辑异或
10、FNC29(NEG) 求补码
旋转、位移应用指令
1、FNC30、FNC31(RORP、ROLP)左、右旋转
2、FNC32 FNC33(RCRP、RCLP)包含进位标识的左、右旋转
3、FNC34、FNC35(SFTRP、SFTLP)位数据左、右移
4、FNC36、FNC37(WSFRP、WSFLP)字符数据左、右移
5、FNC38、FNC39(SFWRP、WFRDP)字符数据位移写入与读出
数据处理应用指令
1、FNC40(ZRST)区域数据复位
2、FNC41(DECO)译码
3、FNC42(ENCO)编码
4、FNC43(SUM)ON位总数计算
5、FNC44(BON)ON位判断
6、FNC45(MEAN)平均值
7、FNC46、FNC47(ANS、ANR)警报线圈的输出与复位
8、FNC48(SQR)开平方
高速处理应用指令
1、FNC50(RER)输入/输出信号立即处理
2、FNC51(REFF)改变输入端响应时间
3、FNC52(MTP)矩阵输入
4、FNC53(DHSCS)高速计数器比较设置
5、FNC54(DHSCR)高速计数器比较复位
6、FNC55(DHSZ)高速计数器区域比较
7、FNC56(SPD)脉冲密度
8、FNC57(PLSY)脉冲输出
9、FNC58(PWM)脉冲宽度调制
10、FNC59(PLSR)加减速脉冲输出
宏应用指令
1、FNC60(IST)步进运转状态设定
2、FNC61(SER)多笔数据比较
3、FNC62(ABSD)绝对式控制
4、FNC63(INCD)相对式控制
5、FNC64(TIMR)调整式定时器
6、FNC65(STMR) 特殊定时器
7、FNC66(ALTP)交替信号
8、FNC67(RAMP)求斜率
9、FNC69(SORT)数据排序
外部设定显示应用指令
1、FNC70(TKY)10个按钮输入
2、FNC71(HKY)16个按钮键输入
3、FNC72(DSW)指拨开关
4、FNC73(SEGD)7段数码管译码
5、FNC74(SEGL)7段数码扫描
6、FNC75(ARWS)箭头开关外部设定调整