unsigned long long int pow

时间:2013-03-05 13:22:47

标签: c

我有以下幂函数,它对整数进行操作,并且工作正常:

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

现在我想要一个允许exp>的版本。所以我使用unsigned long long int:

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实现有什么问题?

2 个答案:

答案 0 :(得分:5)

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

答案 1 :(得分:2)

C标准第6.5p4节:

  

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

C标准第6.5p5节:

  

如果在评估过程中出现异常情况   表达式(即,如果结果未在数学上定义或   不在其类型的可表示值的范围内),行为   未定义。

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