⑴ 關於三菱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)箭頭開關外部設定調整