2013-03-05 180 views
5

我有对整数经营以下幂函数,它工作正常:无符号长long int类型战俘

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类型长整型:

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

我的unsigned long long int实现有什么问题?

回答

5

您的base变量太小。与其他人一样,将其更改为unsigned long long int,因为它保存的数字大于2^32。 C标准的

+0

确实,非常感谢,现在就工作! – DanielFetchinson 2013-03-05 13:53:13

2

第6.5p4:

一些运营商(一元运算符〜,和二进制运算符< <,>>, &,^和|,统称为位运算符)需要 具有整数类型的操作数。这些运算符产生值 ,这些值取决于整数的内部表示,并且具有用于签名类型的实现定义和未定义方面。 C标准的

第6.5p5:

如果 表达的评价(即,如果该结果不是数学上不范围限定或 期间发生的异常条件其类型的可表示值),行为 未定义。

如果在此代码中使用int之前似乎是个好主意,那么现在就不应该这样做。这两个部分都说你的代码不像它可能的那样便携。

+0

哪部分代码违反了标准的引用部分? – 2013-03-05 13:35:23

+0

@MichałTrybus嗯,6.5p5是你答案背后的逻辑。 – Sebivor 2013-03-05 13:48:03

+0

哦,当然。我看到:D – 2013-03-05 13:57:37