[英]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
換行時停止。 由於i
在j
后面,所以將包含最大值。 請注意,這可能不適用於帶符號的類型-它們在溢出時會產生未定義的行為。
我假設您正在嘗試查找無符號整數可以存儲的最大限制(十進制為65,535)。 程序超時的原因是,當int達到可存儲的最大值時,它“結束了”。 下次j遞增時,它將為65,535; 我將是0。
這意味着您要使用的方式永遠不會等於j,並且循環將無限期地運行。 如果將其更改為Damien擁有的,則i == 65,535; j等於0。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.