Is this how the + operator is implemented in C?

后端 未结 9 1720
抹茶落季
抹茶落季 2021-01-30 06:21

When understanding how primitive operators such as +, -, * and / are implemented in C, I found the following snippet from an

9条回答
  •  既然无缘
    2021-01-30 06:41

    Just out of interest, on the Atmega328P processor, with the avr-g++ compiler, the following code implements adding one by subtracting -1 :

    volatile char x;
    int main ()
      {
      x = x + 1;  
      }
    

    Generated code:

    00000090 
    : volatile char x; int main () { x = x + 1; 90: 80 91 00 01 lds r24, 0x0100 94: 8f 5f subi r24, 0xFF ; 255 96: 80 93 00 01 sts 0x0100, r24 } 9a: 80 e0 ldi r24, 0x00 ; 0 9c: 90 e0 ldi r25, 0x00 ; 0 9e: 08 95 ret

    Notice in particular that the add is done by the subi instruction (subtract constant from register) where 0xFF is effectively -1 in this case.

    Also of interest is that this particular processor does not have a addi instruction, which implies that the designers thought that doing a subtract of the complement would be adequately handled by the compiler-writers.

    Does this take advantage of two's complement or other implementation-dependent features?

    It would probably be fair to say that compiler-writers would attempt to implement the wanted effect (adding one number to another) in the most efficient way possible for that particularly architecture. If that requires subtracting the complement, so be it.

提交回复
热议问题