單片機(jī)CY與OV的區(qū)別
CY(Carry): 用于表示加法進(jìn)算中的進(jìn)位和減法運(yùn)算中的借位,加法運(yùn)算中有進(jìn)位或減法運(yùn)算中有借位則CY位置1,否則為0
OV: 表示運(yùn)算過(guò)程中是否發(fā)生了溢出,若運(yùn)算結(jié)果超過(guò)了8位二進(jìn)制數(shù)所能表示數(shù)據(jù)的范圍即有符號(hào)數(shù)-128~+127,則標(biāo)志位置1。
對(duì)無(wú)符號(hào)數(shù)的運(yùn)算,判斷只需CY即可,OV無(wú)作用。
對(duì)有符號(hào)數(shù)的運(yùn)算,OV位是有用的?!癘V位是C6位進(jìn)位與C7位進(jìn)位的異或”,說(shuō)法對(duì)的(對(duì)51單片機(jī)而言),但不同的計(jì)算機(jī)說(shuō)法不一
CY位是累加器的進(jìn)位、借位標(biāo)志。下文的敘述按16位機(jī)來(lái)舉例說(shuō)明,如果是8位機(jī)或其它字長(zhǎng),則可換一個(gè)例子,但道理相似。
對(duì)于無(wú)符號(hào)數(shù)的運(yùn)算,CY位就可以表示其是否溢出。但如果是有符號(hào)數(shù),則不能按CY標(biāo)志來(lái)判斷了。為此,設(shè)了另一個(gè)標(biāo)志OV,其含義就是“假如是有符號(hào)數(shù)運(yùn)算,是否出現(xiàn)了溢出”。
例如對(duì)于16位運(yùn)算器,65534 + 3,(即二進(jìn)制的1111111111111110 + 0000000000000011),
本該得65537,(即二進(jìn)制的10000000000000001),但因?yàn)榧拇嫫髦挥?6位,最高位的那個(gè)1丟掉了(進(jìn)入了CY標(biāo)志)。結(jié)果寄存器中只剩下了1,(即二進(jìn)制的0000000000000001)。
此時(shí),我們可以說(shuō),16位的無(wú)符號(hào)數(shù)加法,65534+3溢出了,溢出后的答案成了1。
但是對(duì)于有符號(hào)整數(shù),情況就不同了。有符號(hào)整數(shù)采用補(bǔ)碼表示法。16位有符號(hào)整數(shù)不可能表示65534,此時(shí)如果機(jī)內(nèi)二進(jìn)制是1111111111111110,程序中認(rèn)為它是-2,故:
機(jī)內(nèi)的二進(jìn)制的1111111111111110 + 0000000000000011,代表的是(-2) + 3。
請(qǐng)注意,此時(shí)的(-2)+3和上文的無(wú)符號(hào)數(shù)65534+3,在CPU的運(yùn)算器硬件上完全相同,都是得到和為1,而CY標(biāo)志也為1。
但是,有符號(hào)數(shù)(-2)+3=1并無(wú)溢出。故此時(shí)的CY標(biāo)志不能代表它溢出了。
另外再舉一例:
無(wú)符號(hào)數(shù)32763 + 8 = 32771,沒(méi)有進(jìn)位,CY標(biāo)志為0。此時(shí)并不溢出。
但是,如果是有符號(hào)數(shù)32763 + 8,這就是溢出了,因?yàn)?2773的二進(jìn)制為1000000000000011,作為有符號(hào)數(shù)會(huì)被看成負(fù)數(shù)-32765。16位有符號(hào)數(shù)不可能表示32773的。
不管是有符號(hào)數(shù)還是無(wú)符號(hào)數(shù),CPU的二進(jìn)制運(yùn)算器機(jī)器加、減操作是一樣的,但其“溢出”的條件不同。
現(xiàn)在大多數(shù)的計(jì)算機(jī)中,如果是無(wú)符號(hào)數(shù),都可以用CY標(biāo)志來(lái)判斷其是否溢出;而如果是有符號(hào)數(shù),則需要用OV標(biāo)志來(lái)判斷其是否溢出。
至于OV標(biāo)志在邏輯上又是根據(jù)什么產(chǎn)生的呢?則不同的計(jì)算機(jī)上有不同的實(shí)現(xiàn)方法,但效果都是一樣。
這里介紹一種道理比較容易懂的方法:“雙符號(hào)位法”。具體是:
作加、減法前,先將兩個(gè)運(yùn)算數(shù)都按照有符號(hào)數(shù)的規(guī)則擴(kuò)充成17位。即:符號(hào)位是0的前面添一位0,符號(hào)位是1的前面添一位1。
然后按17位的機(jī)器加、減,得出17位的結(jié)果。
如果17位結(jié)果的高兩位(即雙符號(hào)位)不同,就置OV標(biāo)志為1,否則,OV標(biāo)志為零。
然后取其低16位作為最后結(jié)果。