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

2021-09-24 20:30:47 字數 949 閱讀 7778

喵哥最近遇到乙個問題,比較兩個數的時候經常會出現很嚴重的bug,比如:

unsigned int a = 0;

int b = -2;

if (a < b)

b = 1;

cout << b << endl;

乍一看這段**輸出的應該是-2,0肯定不會小於-2嘛,但是事實上,「b = 1;」這行**是會被執行的。如果大家對算術轉換比較熟悉的話,應該會想到這應該是發生了「整型提公升」——int提公升為unsigned int。其實大家感到困惑的乙個重要原因是:書本給的例子大多數都是加減乘除時整型提公升,讓人很慣性地認為只有進行算術運算的時候才會發生轉換。事實上,這些型別的轉變發生在所有雙目運算子執行的時候(雙目運算子的兩個運算物件型別不一樣)。那麼自然而然地,在「

為了直觀地表示這種轉換,喵哥把**的彙編貼出來:

在彙編中,b的值臨時放在eax中,在執行到(a如果把a的值改為4294967295,即unsigned int的最大值,則條件會為false。

再如:

string str = "hello";

int pos = str.find('a');

string::size_type n = string::npos;

if (pos == n)

cout << "no";

string::npos的值是unsigned long long的最大值18446744073709551615,即long long的-1,在比較pos與n時,pos的型別會自動提公升為unsigned long long。

通常,認為string::npos等於-1就好了。

C 11 有符號整型與無符號整型的比較運算

在執行讀取操作的時候,使用cin str string物件會自動忽略開頭的空白,並從第乙個真正的字元開始讀取,直到遇見下乙個空白,但是getline cin,str 函式不會忽略空白,而是自動讀取一行的所有值,直到換行符出現,並且將換行符也讀入了,然後把所讀去的內容存到string物件去 注意不存在...

學習無符號整型和有符號整型數的範圍

可以看出來,32位有符號整數可表示的最大數大於20億,32位無符號整數可表示的最大數大於40億,因此,碰上十幾億的海量資料處理時,不要慌 1 在32位系統中2 int的範圍是 2147483648,2147483647 3 unsigned int的範圍是 0,4294967295 4const u...

判斷無符號整型和有符號整型

在計算機記憶體裡,整數以補碼形式儲存 正數的補碼即原碼 正數如 50000 原碼為 0000 0000 0000 0000 1100 0011 0101 0000 補碼為 0000 0000 0000 0000 1100 0011 0101 0000 負數如 100 原碼為 1000 0000 00...