c 無符號型別與負數的比較

2021-09-24 09:58:15 字數 1216 閱讀 9666

#include

using namespace std;

intmain()

else

return0;

}

如上這段**,比較乙個無符號數 10 和乙個負數 -1 ,最後的輸出結果卻是:

no
10 > -1是很顯然的事,但是在程式中無符號數和有符號的負數之間進行比較時卻出現了問題。

再來看看如下這段**:

#include

using namespace std;

intmain()

這段**將乙個負數i隱式地轉換為 無符號型別uint,下面看看輸出結果為:

4294967295
會發現,當乙個負數轉化為乙個無符號數的時候,這個數反而變成了乙個非常大的正數。

所以,當無符號數與負數進行比較時,負數會被轉化成無符號型別(比較大的),所以產生了10<-1的情況。

232次方 =4294967296,所以uint實際上是232次方-1

如果將i的值改為-100,那麼輸出結果會變成4294967196,也就是2^32-100

所以如果 乙個負數值為-n,那麼它轉化為無符號數的值就是2^32-n

因此在做有關於無符號資料的比較時,都應該注意這個問題。

無符號的資料還有很多,很容易被忽略:

size_t型別資料如:

sizeof

()的返回值

strlen

()的返回值

string.

size

()的值

stl中的size函式等等

…………

無符號右移負數 關於負數的右移與無符號右移運算小結

對於帶符號右移,若為負數,則在儲存時首位表示符號位,其值為1,表示該值是負數的移位,在移位過程中,高位補1,若符號位是0,表示是正數,在移位過程中高位補零,兩者的前提是符號位保持不變 對於負數的右移 因為負數在記憶體中是以補碼形式存在的,所有首先根據負數的原碼求出負數的補碼 符號位不變,其餘位按照原...

無符號數字與負數 程式設計細節

首先執行一段程式,結果出現之前可以 一下結果哦!include include using namespace std int main else if sizeof abc 1 else if string abc size 1 else return 0 分割線 這是執行的結果 3 yes1 4...

無符號整型與有符號整型的比較

喵哥最近遇到乙個問題,比較兩個數的時候經常會出現很嚴重的bug,比如 unsigned int a 0 int b 2 if a b b 1 cout b endl 乍一看這段 輸出的應該是 2,0肯定不會小於 2嘛,但是事實上,b 1 這行 是會被執行的。如果大家對算術轉換比較熟悉的話,應該會想到...