2013-03-05 27 views
5

Ho la seguente funzione di potere che opera su numeri interi e funziona benissimo:unsigned long long int pow

int ipow(int base, int exp) 
{ 
    int result = 1; 
    while(exp) 
    { 
     if (exp & 1) 
     { 
      result *= base; 
     } 
     exp >>= 1; 
     base *= base; 
    } 
    return result; 
} 

ora mi piacerebbe avere una versione che consente di exp> 32. Quindi io uso unsigned long lunghe interi:

unsigned long long int ipow(int base, int exp) 
{ 
    unsigned long long int result = 1ULL; 
    while(exp) 
    { 
     if (exp & 1) 
     { 
      result *= (unsigned long long int)base; 
     } 
     exp >>= 1; 
     base *= base; 
    } 
    return result; 
} 

Ma questa seconda versione non sembra funzionare:

unsigned long long int x; 
x = ipow(2, 35); 
printf("%llu\n", x); 

questa uscita volontà 0.

Qual è il problema con la mia implementazione long long int unsigned?

risposta

5

La tua variabile base è troppo piccola. Passa a unsigned long long int, come gli altri, poiché contiene numeri maggiori di 2^32.

+0

Infatti, grazie mille, ora funziona! – DanielFetchinson

2

Sezione 6.5p4 dello standard C:

Alcuni operatori (l'operatore unario ~, e gli operatori binari < <, >>, &, ^, e | collettivamente descritto come operatori bit a bit) sono richiesti per avere operandi con tipo intero. Questi operatori forniscono i valori che dipendono dalle rappresentazioni interne dei numeri interi e presentano aspetti definiti dall'implementazione e non definiti per i tipi firmati .

sezione 6.5p5 della norma C:

Se si verifica una condizione eccezionale durante la valutazione di un espressione (cioè, se il risultato non è matematicamente definito o non nell'intervallo valori rappresentabili per il suo tipo), il comportamento non è definito.

Se sembrava una buona idea utilizzare int in questo codice, non dovrebbe ora. Entrambe queste sezioni stanno dicendo che il tuo codice non è così portatile come potrebbe essere.

+0

Quale parte del codice è contro le parti citate dello standard? –

+0

@ MichałTrybus Bene, 6.5p5 è la logica dietro la tua risposta. – Sebivor

+0

Oh, certo. Io semino –

Problemi correlati