2013-03-05 2 views
5

У меня есть следующие функции питания, которая работает с целыми числами и она отлично работает:неподписанных долго долго ИНТ пау

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

Теперь я хотел бы иметь версию, которая позволяет Exp> 32. Таким образом, я использую неподписанный долгий длинные Интсы:

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

Но эта вторая версия, кажется, не работает:

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

это будет выводить 0.

В чем проблема с моей неподписанной длинной длинной реализацией?

ответ

5

Ваша base переменная слишком мала. Измените его на unsigned long long int, как и другие, так как он содержит цифры больше 2^32.

+0

Действительно, спасибо большое, сейчас работает! – DanielFetchinson

2

Раздел 6.5p4 стандарта C:

Некоторые операторы (унарный оператор ~, и бинарные операторы < <, >>, &,^и |, в совокупности называют операторами поразрядными) требуются , чтобы иметь операнды с целым типом. Эти операторы дают значения , которые зависят от внутренних представлений целых чисел и имеют определенные для реализации и неопределенные аспекты для подписанных типов.

Раздел 6.5p5 стандарта C:

Если исключительная ситуация возникает в процессе оценки в выражении (то есть, если результат не определен или математически не в диапазоне представляемые значения для его типа), поведение не определено.

Если в этом коде было бы неплохо использовать int, то этого не должно быть. Оба этих раздела говорят, что ваш код не так переносим, ​​как мог бы быть.

+0

Какая часть кода соответствует цитированным частям стандарта? –

+0

@ MichałTrybus Ну, 6.5p5 - это логика вашего ответа. – Sebivor

+0

О, конечно. Я вижу: D –

Смежные вопросы