1 原码、反码、补码

表示正数负数
原码数据本身的二进制表示(符号位为0)数据本身的二进制表示(符号位为1)
反码和原码一样符号位不变,其余各位按位取反(1变0,0变1)
补码和原码一样反码加1

2 指令详解

指令格式含义
neg reg/memreg/mem ⇐ \Leftarrow 0-reg/mem,
即用0减操作数,并将求得的结果存入指定的寄存器或内存单元(把操作数按位取反,末位加1

2.1 理解方式一

1 操作数为正数的情况

mov al,64h  
neg al	    ; al=9ch

首先明确一点,在计算机中,数据都是以补码的形式存储的

1、64h的补码表示:0110 0100
2、按位取反:1001 1011
3、末位加1:1001 1100 = 9ch

2 操作数为负数的情况

mov al,-8         
neg al            ; al=08h
  • -8的原码表示:1000 1000
  • -8的反码表示:1111 0111
  • -8的补码表示:1111 1000
  • 按位取反:0000 0111
  • 末位加1:0000 1000 = 8 = 08h

3 总结

当使用neg指令时:

1、先将操作数换成补码表示
2、再将操作数按位取反
3、最后加1。此时就能求出正确结果了。

2.2 理解方式二

当然,还可以从运算的角度计算(推荐使用这种方法),而且相对简单。仍然以上面例子说明:

  • 当 al = 64h,neg al ⟺ \Longleftrightarrow 0 - al ⟺ \Longleftrightarrow 0 - 64h = -64h
  • 当 al = -8,neg al ⟺ \Longleftrightarrow 0 - al ⟺ \Longleftrightarrow 0 - (-8)= 8

依旧要强调的是:在计算机中,数据都是以补码的形式存储的

1、求 -64h 的补码

  • -64h 原码:1110 0100
  • -64h 反码:1001 1011
  • -64h 补码:1001 1100 = 9ch

2、8的补码。正数的原、反、补码相同

  • 8 原码:0000 1000
  • 8 反码:0000 1000
  • 8 补码:0000 1000 = 8

可以看出,这种方法对于操作数为负数的情况比较简便,相当于直接求绝对值。而操作数为正数时,就是求正数相反数的补码表示

总结:

  • 操作数 > 0:加负号,求反码
  • 操作数 < 0:直接求绝对值
Logo

旨在为数千万中国开发者提供一个无缝且高效的云端环境,以支持学习、使用和贡献开源项目。

更多推荐