6

我有以下对整数运算的幂函数,它工作正常:

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

但是第二个版本似乎不起作用:

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

这将输出 0。

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

4

2 回答 2

7

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

于 2013-03-05T13:30:23.593 回答
2

C 标准的第 6.5p4 节:

某些运算符(一元运算符 ~ 和二元运算符 <<、>>、&、^ 和 |,统称为按位运算符)需要具有整数类型的操作数。这些运算符产生的值取决于整数的内部表示,并且具有符号类型的实现定义和未定义方面。

C标准第6.5p5节:

如果在计算表达式期间出现异常情况(即,如果结果未在数学上定义或不在其类型的可表示值范围内),则行为未定义。

int如果以前在此代码中使用它似乎是一个好主意,那么现在不应该。这两个部分都在说您的代码没有它可以移植的那样可移植。

于 2013-03-05T13:30:55.143 回答