考慮這個C代碼:爲什麼C不運行unsigned int與負值的比較?
#include "stdio.h"
int main(void) {
int count = 5;
unsigned int i;
for (i = count; i > -1; i--) {
printf("%d\n", i);
}
return 0;
}
我的觀察/問題:循環永遠不會被執行。但是,如果我將數據類型從unsigned int更改爲int,則所有內容都按預期工作。
我一直在考慮未簽名的整數作爲值,「環繞」,當你試圖保持減去他們。所以,當我是零,我減1,它會繞到UINT_MAX。而且由於它的價值從不消極,所以這將是一個無限循環。 (而這正是當我將比較從i> -1改變爲i> = 0時發生的情況。)
我的邏輯中某處出現故障,因爲如果我是無符號的,循環永遠不會執行,而且我將它與-1進行比較。編譯器會以某種方式優化它,或者運行時值的行爲與我期望的不同。
爲什麼循環不能運行?
您是否嘗試過直接轉換字面值-1? – 0xC0000022L 2011-06-02 17:17:11
你是完全正確的。但請記住,5> UINT_MAX是錯誤的。 – sidyll 2011-06-02 17:18:29
http://stackoverflow.com/questions/2084949/arithmetic-operations-on-unsigned-and-signed-integers http://stackoverflow.com/questions/24466857/why-sizeofint-is-not-greater-than- 1 http://stackoverflow.com/questions/3100365/why-is-%E2%88%921-sizeofint – 2015-03-24 11:59:15