Wpis z mikrobloga

Przeglądałem cudzy kod ubsługi UART na PIC16F88.


int16_t val;
(....)

// Handle negative numbers
if (val < 0) {
UART_WriteChar('-'); // Write negative sign
val = val * -1; // Convert to positive
}

Nie prościej zamienić liczbę ujemną na dodatnią za pomocą:

val = -val;
Mnożenie przez -1 ma tutaj jakąś przewagę?
Oczywiście z punktu widzenia małej szybkości procesora, 8-bitowych rejestów i śladowych ilości RAMu.

  • 8
@RARvolt: najprościej będzie spróbować skompilować oba kody i sprawdzić jak kompilator radzi sobie z optymalizacją. Pamiętaj, że assembler ma skończona liczbę instrukcji, więc być może pierwszy zapis kompiluje się do krótszej kodu. Jeśli sprawdzisz, to daj znać, bo sam jestem ciekawy ;-)
@RARvolt: Raczej wyjdzie na to samo. Myślę że twórca raczej nie zastanawiał się nad tym faktem tylko zrobił tak jak jest przyzwyczajony. Dla ciebie prościej jest inaczej niż dla niego.
680 ;uart.c: 114: val = val * -1;
681 0041 1283 bcf 3,5 ;RP0=0, select bank0
682 0042 1303 bcf 3,6 ;RP1=0, select bank0
683 0043 09A9 comf UART_WriteInt@val,f
684 0044 09AA comf UART_WriteInt@val+1,f
685 0045 0AA9 incf UART_WriteInt@val,f
686 0046 1903 skipnz
687 0047 0AAA incf UART_WriteInt@val+1,f

680 ;uart.c: 114: val = -val;
681 0041 1283 bcf 3,5 ;RP0=0, select bank0
682 0042 1303 bcf 3,6 ;RP1=0, select bank0
683 0043
@kuhar:

#define INT16_MIN (-32768)
#define INT16_MAX (32767)
To jest U2 więc próba wykonania powyższej operacji spowoduje usunięcie wszechświata czy tylko stworzy w miejscu procesora czarną dzurę? ( ͡° ͜ʖ ͡°)
@kuhar:
Drugi argument to ilość cyfr - nieistotne.

Kod:

UART_WriteLine("\n\n-*- PIC16F88 -*-");
UART_WriteInt(-32767, -1);
Wyjście:

-*- PIC16F88 -*-
-32767
Kod:

UART_WriteLine("\n\n-*- PIC16F88 -*-");
UART_WriteInt(32767, -1);
Wyjście:

-*- PIC16F88 -*-
32767
Kod:

UART_WriteLine("\n\n-*- PIC16F88 -*-");
UART_WriteInt(-32768, -1);
Wyjście:

-*- PIC16F88 -*-
--.)*(
Żyję, wszechświat przetrwał ( ͡° ͜ʖ ͡°)