补码

作者: NextStepPeng | 来源:发表于2018-04-19 10:31 被阅读0次
     有符号
    便于理解

    为简化起见,我们8位二进制数来讲。

    先看8位二进制与无符号数和有符号数的对应

    二进制 无符号 有符号

    00000000 0 0

    00000001 1 1

    ...

    01111110 126 126

    01111111 127 127

    10000000 128 -128

    10000001 129 -127

    ...

    11111110 254 -2

    11111111 255 -1

    按照上述对应关系,我们可以把二进制运算解释为有符号或无符号的十进制运算。

    只有算术运算才会有正负号问题,而算术运算中最主要的就是加法系列指令和减法系列指令。范围内的运算咱们不关心,主要看看超出范围的运算如何处理。

    当运算超出范围后,CPU会改变标志寄存器中的值(置1),来表示当前的运算结果。算术运算主要用到的标志位如下。

    OV(溢出):运算结果超过数值表达范围(比如8位数运算超过256);

    ZR(零):运算结果为0时;

    PL(符号):运算结果的最高位为1。

    AC(辅助进位):低4位是否向高4位进/借位;

    CY(进位):高位进/借位;

    1. 当加法系指令的二进制结果大于11111111时会产生溢出,结果保留超过11111111的部分,并置溢出位为1。

    例如加法add指令:

    11111110+00000011=100000001=>00000001

    标志位:

    由于低4位和高4位都进位了,所以AC和CY置1

    对应的无符号运算:

    254+3=1

    对应的有符号运算:

    -2+3=1

    2.  减法系的指令会产生“减不过”的情况。减不过时cpu会给左数的最高位添加一个1,使得比右数大,再做减法并置溢出。

    例如减法sub指令:

    00000010-00000011=>100000010-00000011=11111111

    标志位:

    由于低4位和高4位都借位了,所以AC和CY置1,由于运算结果高位为1,PL置1

    对应的无符号运算:

    2-3=255

    对应的有符号运算:

    2-3=-1

    相关文章

      网友评论

          本文标题:补码

          本文链接:https://www.haomeiwen.com/subject/pmnikftx.html