不同種類的整型比較,到底發生了什麼?

2021-06-16 03:00:52 字數 852 閱讀 4553

看這麼兩行**:

int i = -1;

cout << (char(i) == unsigned char(i)) << endl;

在vc6.0下,永遠輸出0。而下面這兩行**也永遠輸出0

int i = 255;

cout << (char(i) == unsigned char(i)) << endl;

而實際上,以上兩個**中,char(i)和unsigned char(i)具有的記憶體布局都是完全相同的。由於整型之間的型別轉換遵循這樣的原則:當目標型別比原型別短的時候,直接截斷原型別。而當目標型別較長,則無符號型別會直接在高位補0,有符號型別在高位補符號位。

在vc6下,而當兩個長度相同,並且具有相同記憶體布局的整型相比較的時候,編譯器做如下的工作:

首先兩者長度<=int的長度的時候,全部轉化為int,然後實施比較。

所以char(-1)轉化的結果是0xffffffff,而unsigned char(-1)轉化的結果是0x000000ff。兩者作為int比較的時候,自然是不相等的。

但是,特別的,當兩者長度剛好是int長度的時候,比較的結果僅取決於記憶體布局,而有符號和無符號的轉化也不會改變記憶體布局。

這個事實引起了乙個問題,當我們使用char/unsigned char,short/unsigned short這模擬int短的型別的時候,無符號型別的變數是絕對不會和有符號的-1相等的,而使用int的時候,int(-1)和unsigned int(-1)則是完全相等的。這使得修改變數型別會引發比較結果的變化,尤其是在做變數擴充套件,或者在模板**中這個問題有可能會引發難以覺察的錯誤。

對這個問題的建議是:永遠都不要進行有符號型別和無符號型別之間的數值比較,不同長度的型別之間的比較也要盡量避免。

不同種類軟體的比較

這些軟體的開發者是怎麼說服你 陌生人 成為他們的使用者的?他們的目標都是盈利麼?他們的目標都是賺取使用者的現金麼?還是別的?基本都是為了盈利,比如 遊戲中的虛擬裝備需要花錢買,有些軟體只提供試用三十天的條件,如果需要繼續使用就必須收費 有些軟體通過各種很多方法來吸引使用者,比如發紅包,提供優惠券 當...

不同種類軟體的比較

軟體有很多種 shrinkwrap 在包裝盒子裡面的軟體 internal software 企業或學校或某組織內部的軟體 games 遊戲 operating systems 作業系統 tools 工具軟體 選取三種軟體,請分析它們各自的特點。1 這些軟體的開發者是怎麼說服你 陌生人 成為他們的使...

不同種類日誌的顯示時間的問題

不同日誌的時間顯示問題.event log 抓取日誌的機器時間轉換到你時區的時間 sharepoint audit log 格林威治時間 gmt 0 注意 北京時間是gmt 8 performance log 抓取日誌時的機器時間 sharepoint uls log 抓取日誌時的機器時間 netw...