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 , C F 等 标 志 位 是 由 机 器 码 运 算 结 果 决 定 的 , 是 否 为 带 符 号 数 并 不 影 响 \color {blue}{OF,CF等标志位是由机器码运算结果决定的,是否为带符号数并不影响} OF,CF等标志位是由机器码运算结果决定的,是否为带符号数并不影响
所 以 , 才 会 有 带 不 带 符 号 它 的 O F , S F , C F 都 一 样 \color {green}{所以,才会有带不带符号它的OF,SF,CF都一样} 所以,才会有带不带符号它的OF,SF,CF都一样
终极简单的判定方法:
求OF就把机器码转成带符号数然后运算,看有没有溢出
求CF同理,转成无符号数,然后运算看有没有溢出