PIC Microcontoller Math Method

Two's complement 8 bit

from Andy Warren

If [...] your original number is in a register, you can do it with this bit of code:

        COMF    REG     ;REG = two's-complement of REG.
        INCF    REG     ;

or this one:

        COMF    REG,W   ;W = two's-complement of REG
        ADDLW   1       ;(REG is unchanged).

If the original number is in W, the easiest way is:

        SUBLW   0       ;W = two's-complement of W.

Clyde Smith-Stubbs [clyde at htsoft.com] of HI-TECH Software says

[These snippits do not handle the problem: REG = 0x80] because there is no correct result in this case. The value 0x80 interpreted as 2's complement is legal, and equal to -128. The negative of this, 128, is NOT representable as an 8 bit 2's complement number.

From http://www.myke.com/basic.htm: Negating the Contents of "w"

If you have to Negate the contents of the "w" register, you could use the code above (after saving the value in "w" into a register) or you could use the code below for low-end devices (PIC16C5x, PIC12C5xx, PIC16C505). Any file register can be used for this code because its contents are never changed.
  addwf  Reg, w           ;  w = w + Reg
  subwf  Reg, w           ;  w = Reg - w
                          ;  w = Reg - ( w + Reg )
                          ;  w = -w
              

Interested: