2013-03-05 21 views
5

Mam następującą funkcję zasilania, która działa na całkowite i to działa dobrze: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; 
} 

Teraz chciałbym mieć wersję, która pozwala exp> 32. Tak więc używać unsigned long długie ints:

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; 
} 

Ale ta druga wersja nie wydaje się działać:

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

to wyjście będzie 0.

Na czym polega problem z niepodpisanym długofalowym wdrożeniem?

Odpowiedz

5

Twoja zmienna base jest za mała. Zmień go na unsigned long long int, podobnie jak inne, ponieważ zawiera liczby większe niż 2^32.

+0

Rzeczywiście, wielkie dzięki, działa już teraz! – DanielFetchinson

2

Sekcja 6.5p4 standardu C:

Niektórzy operatorzy (operator jednoargumentowy ~ i operatorów binarnych < <, >>, &^i | zbiorczo określane jako operatorów bitowe) są wymagane , aby mieć operandy, które mają typ całkowity. Operatory te dają wartości , które zależą od wewnętrznych reprezentacji liczb całkowitych i mają zdefiniowane implementacje i niezdefiniowane aspekty dla typów podpisanych.

Sekcja 6.5p5 standardu C:

Jeśli występuje stan wyjątkowy podczas dokonywania oceny ekspresji (to znaczy, jeśli wynik nie jest matematycznie określonych lub nie w zakresie możliwe do reprezentowania wartości dla tego typu), zachowanie jest niezdefiniowane.

Jeśli w tym kodzie wydawało się dobrym pomysłem skorzystanie z int, nie powinno to teraz działać. Obie te sekcje mówią, że twój kod nie jest tak przenośny, jak mógłby być.

+0

Która część kodu jest sprzeczna z cytowanymi częściami normy? –

+0

@ MichałTrybus Cóż, 6,5 p5 to logika kryjąca się za twoją odpowiedzią. – Sebivor

+0

Och, oczywiście. Rozumiem: D –

Powiązane problemy