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