簡體   English   中英

unsigned long long int pow

[英]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;
}

現在我想要一個允許exp> 32的版本。所以我使用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實現有什么問題?

您的base變量太小。 將其更改為unsigned long long int ,與其他unsigned long long int一樣,因為它包含的數字大於2^32

C標准第6.5p4節:

一些運算符(一元運算符〜,以及二元運算符<<,>>,&,^和|,統稱為按位運算符)需要具有整數類型的操作數。 這些運算符產生的值取決於整數的內部表示,並且具有已簽名類型的實現定義和未定義方面。

C標准第6.5p5節:

如果在計算表達式期間發生異常情況(即,如果結果未在數學上定義或未在其類型的可表示值范圍內),則行為未定義。

如果以前在這段代碼中使用int似乎是個好主意,現在就不應該了。 這兩節都說你的代碼不是那么便攜。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM