OF CF 标志位的判定

2006世界杯 2025-09-27 07:25:45 3314

OF:最高位进位⊕次高位进位(对带符号数才有意义)

\color {green}{最高位进位:进位出去(溢出去)}

最高位进位:进位出去(溢出去)

\color {green}{次高位进位:进位到最高位(对带符号数来说即符号位)}

次高位进位:进位到最高位(对带符号数来说即符号位)

CF: sub⊕C(⊕为异或,CF对无符号数才有意义)

s

u

b

1

\color {green}{作减法则sub为1}

作减法则sub为1

C

\color {green}{C为进位输出——最高位有无进位出去(溢出去)}

C为进位输出——最高位有无进位出去(溢出去)

举例:

假设n=8,机器数X和Y的真值分别为x和y

OF:

来看带符号那一行:

0xB0——1011 0000 (-80) 0x8C——1000 1100(-116)

X+Y:0011 1100 (60)

8

[

127

,

128

]

,

2

n

256

\color {green}{8位机器数表示范围 [127,-128] , 负溢出后加上2^n,这题中即加上256}

8位机器数表示范围[127,−128],负溢出后加上2n,这题中即加上256

80

116

+

256

=

60

\color {green}{-80-116+256=60}

−80−116+256=60

关于溢出的处理,可以参照这个博客:计算机内加减法的溢出处理

X

+

=

\color {red}{对原数X(原数+加数=结果):}

对原数X(原数+加数=结果):

1

1

+

1

0

+

0

1

0

=

1

O

F

1

\color {red}{最高位进位为1(最高位1+1,进位),次高位没有进位(0+0),1⊕0=1,则OF为1}

最高位进位为1(最高位1+1,进位),次高位没有进位(0+0),1⊕0=1,则OF为1

CF:

来看无符号那一行:

0xB0——1011 0000 (176) 0x8C——1000 1100(140)

X+Y:0011 1100 (60)

8

[

127

,

128

]

,

2

n

256

\color {green}{8位机器数表示范围 [127,-128] , 正溢出后减去2^n,这题中即减去上256}

8位机器数表示范围[127,−128],正溢出后减去2n,这题中即减去上256

X

+

=

\color {red}{对原数X(原数+加数=结果):}

对原数X(原数+加数=结果):

s

u

b

=

0

\color {red}{加法,sub=0}

加法,sub=0

1

+

1

C

=

1

\color {red}{最高位进位(1+1,溢出去了),进位输出C=1}

最高位进位(1+1,溢出去了),进位输出C=1

C

F

=

s

u

b

C

=

0

1

=

1

\color {red}{CF=sub⊕C=0⊕1=1}

CF=sub⊕C=0⊕1=1

/

\color {blue}{最后一提:计算机对带/无符号数的机器码统一处理}

最后一提:计算机对带/无符号数的机器码统一处理

O

F

\color {blue}{OF,CF等标志位是由机器码运算结果决定的,是否为带符号数并不影响}

OF,CF等标志位是由机器码运算结果决定的,是否为带符号数并不影响

O

F

S

F

C

F

\color {green}{所以,才会有带不带符号它的OF,SF,CF都一样}

所以,才会有带不带符号它的OF,SF,CF都一样

终极简单的判定方法:

求OF就把机器码转成带符号数然后运算,看有没有溢出

求CF同理,转成无符号数,然后运算看有没有溢出

站点统计