簡體   English   中英

查找最大的unsigned int…為什么不起作用?

[英]Find largest unsigned int … Why doesn't this work?

您是否不能初始化一個無符號的int然后增加它,直到它不再增加? 這就是我試圖做的,並且遇到運行時錯誤“超時”。 知道為什么這行不通嗎? 任何想法如何正確地做到這一點? #包括

int main() { 

    unsigned int i(0), j(1);
    while (i != j) {
       ++i;
       ++j;
    }
    std::cout << i;

    return 0;

} 

無符號算術在C ++中定義為模2 ^ n(其中n是位數)。 因此,當增加最大值時,您將獲得0

因此,獲得最大值的最簡單方法是使用-1

unsigned int i = -1;
std::cout << i;

(如果編譯器向您發出警告,並且使您0U - 1困擾,則可以使用0U - 1 ,或者使用0初始化,然后遞減。)

因為i 永遠不會等於j ,所以您有一個無限循環。

此外,這對於確定unsigned int的最大值來說是一種非常低效的方法。 numeric_limits可為您提供結果,而無需循環進行2 ^(16、32、64,或者unsigned int )迭代中有很多位。 如果您不想這樣做,可以編寫一個更小的循環:

unsigned int shifts = sizeof(unsigned int) * 8; // or CHAR_BITS
unsigned int maximum_value = 1;
for (int i = 1; i < shifts; ++i)
{
    maximum_value <<= 1;
    ++maximum_value;
}

或者干脆做

unsigned int maximum = (unsigned int)-1;

i將永遠不同於j ,因此您進入了一個無窮循環。 如果要采用這種方法,則代碼應如下所示:

unsigned int i(0), j(1);
while (i < j) {
   ++i;
   ++j;
}
std::cout << i;

return 0;

注意,我將其更改為while (i<j) 一旦j溢出,我將大於j

當發生溢出時,該值不僅會保持最高,還會回繞到盡可能低的數字。

i和j永遠不會相等。 當一個無符號整數價值得到最大程度的增加了它1將導致下一個值將是0。例如,如果最低要考慮無符號的字符則其最大值為255加1,你會得到0后。

因此,您的循環是無限的。

您是否不能初始化一個無符號的int然后增加它,直到它不再增加?

不能。無符號算術是模塊化的,因此在最大值之后會回零。 您可以像循環一樣永久地進行遞增。

任何想法如何正確地做到這一點?

unsigned int max = -1;  // or
unsigned int max = std::numeric_limits<unsigned int>::max();

或者,如果要使用循環來計算它,請將條件更改為(j != 0)(i < j)以在j換行時停止。 由於ij后面,所以將包含最大值。 請注意,這可能不適用於帶符號的類型-它們在溢出時會產生未定義的行為。

我假設您正在嘗試查找無符號整數可以存儲的最大限制(十進制為65,535)。 程序超時的原因是,當int達到可存儲的最大值時,它“結束了”。 下次j遞增時,它將為65,535; 我將是0。

這意味着您要使用的方式永遠不會等於j,並且循環將無限期地運行。 如果將其更改為Damien擁有的,則i == 65,535; j等於0。

暫無
暫無

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

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