回覆列表
  • 1 # 使用者1503123711798

    加減都是一樣的,實際上減法就是當作加法運算的。

    在 rflags 暫存器裡的下面三個標誌位記錄溢位, 符號和進位狀態:

    OF(Overflow Flag)SF(Sign Flag)CF(Carry Flag)ZF(Zero Flag)

    1. 溢位產生的條件

    我們看看下面這個式子,為了簡單,作為例子我用 4 位數計算。

    1.1 產生溢位

    上面的式子中,式子1 在 unsigned 數前提下 7 加 7 結果等於 14,這個結果看似正確。實際上它產生了 Overflow(溢位),結果超出了 4 位數能表達的範圍,這是因為:當用來表達 signed(符號數)時,結果值 1110 卻是 -2,那麼 7 + 7 = -2 這顯示是錯誤的,因此這裡產生了溢位(超過了表達範圍)。而式子2 是正確的。

    在上面兩個式子中,我們可以得到規律:

    正數 + 正數 = 負數,就產生了溢位

    接著再看下面的式子:

    再來看看上面兩個式子,式子1 在 singed 數的前提下 (-4) + (-8) = 4,結果很顯然是錯誤的,因此這個式子也產生了溢位。而式子2 中, (-4) + (-1) = (-5) 這是正確的。

    同樣我們得到規律是:

    負數 + 負數 = 正數,就產生了溢位

    1.2 不產生溢位

    最後再看看這個式子,在 signed 數的情況下:(-1) + 7 = 6 這個結果是正確的,因此這個式子不會產生溢位。

    1.3 溢位總結

    現在我們可以總結產生溢位的條件:

    兩個正數相加,如果結果為負數,就產生了溢位。兩個負數相加,如果結果為正數,就產生了溢位。

    換個角度來說:

    正數 - 負數 = 負數,就產生了溢位。負數 - 正數 = 正數,就產生了溢位。

    那麼是什麼情況不會產生溢位的?

    不同符號的兩個數相加,不會產生溢位。

    那麼我們也可以得出同符號數相減,也不會產生溢位,例如:(-1) - (-1) = -1 + 1 = 0 這個式子是兩個負數相減,等同於負數加正數,這不會產生溢位。

    2. 產生進位與借位

    上面 5 個式子中,有 3 個產生了進位情況,以 4 位數為例,當計算的結果高最位向上進一位時,就會產生進位情況,看看其中一個式子:

    計算結果向上進了 1 位,結果依然是正確的,rflags.CF 被置為 1,rflags.OF 被清 0,如果被作為 unsigned 數進行計算時:12 + 15 = 27,4 位數表達的結果為 11,這時需要得到正確結果,需藉助 CF 標誌。在這裡 CF 被置位。

    當然這裡還會產生一個借位的情況,下面這個式子:

    兩個數相減,最高位不足減,向前借位,這種情況下也會產生 rflags.CF = 1

    3. 符號位

    數的最高位描述符號位,以 4 位數為例,最高位 Bit 3 是符號位,rflags.SF 會根據計算結果置相應的位,rflags.SF = 1 時表示為負數,而 rflags.SF = 0 則為正數。

    4.零標誌位

    ZF 標誌位就簡單了,當運算的結果值為 0 時,ZF = 0

  • 中秋節和大豐收的關聯?
  • 有什麼事是你明知對身體不好,卻還在做的,為什麼?