亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

簽名/無符號比較

簽名/無符號比較

C++
叮當貓咪 2019-07-02 17:32:25
簽名/無符號比較我試圖理解為什么下面的代碼沒有在指定的位置發出警告。//from limits.h#define UINT_MAX 0xffffffff /* maximum unsigned int value */#define INT_MAX  2147483647 /* maximum (signed) int value */             /* = 0x7fffffff */int a = INT_MAX;//_int64 a = INT_MAX;              // makes all warnings go awayunsigned int b = UINT_MAX;bool c = false;if(a < b)              // warning C4018: '<' : signed/unsigned mismatch     c = true;if(a > b) // warning C4018: '<' : signed/unsigned mismatch     c = true;if(a <= b) // warning C4018: '<' : signed/unsigned mismatch     c = true;if(a >= b) // warning C4018: '<' : signed/unsigned mismatch     c = true;if(a == b) // no warning <--- warning expected here     c = true;if(((unsigned int)a) == b) // no warning (as expected)     c = true;if(a == ((int)b)) // no warning (as expected)     c = true;我原以為這與背景晉升有關,但后兩位似乎不這么認為。在我看來,第一個==和其他人一樣,比較也是一種符號/無符號的錯配?
查看完整描述

3 回答

?
炎炎設計

TA貢獻1808條經驗 獲得超4個贊

當比較已簽名和無符號時,編譯器將有符號的值轉換為無符號的值。為了平等,這不重要,-1 == (unsigned) -1..就其他比較而言,這是很重要的,例如,以下情況是正確的:-1 > 2U.

編輯:參考資料:

5/9:(詞句)

許多期望算術或枚舉類型操作數的二進制運算符以類似的方式導致轉換和生成結果類型。其目的是產生一個公共類型,這也是結果的類型。這種模式稱為通常的算術轉換,定義如下:

  • 如果其中一個操作數是長雙操作數,則另一個操作數應轉換為長雙操作數。

  • 否則,如果其中一個操作數是雙操作數,則另一個操作數應轉換為雙操作數。

  • 否則,如果其中一個操作數是浮動的,則另一個操作數將轉換為浮動操作數。

  • 否則,綜合晉升(4.5)應在兩名操作人員中進行。

  • 然后,如果其中一個操作數是無符號的長操作數,則另一個操作數將轉換為無符號長操作數。

  • 否則,如果一個操作數為長int,另一個操作數為無符號int,則如果長int可以表示無符號int的所有值,則無符號int應轉換為長int;否則,這兩個操作數將轉換為無符號長int。

  • 否則,如果其中一個操作數是長的,則另一個將轉換為LONG。

  • 否則,如果其中一個操作數沒有簽名,則另一個操作數應轉換為無符號操作數。

4.7/2:(積分轉換)

如果目標類型是無符號的,則結果值是與源整數一致的最小無符號整數(模2)。n其中n是用來表示無符號類型的位數)。[注意:在兩個補碼表示中,這種轉換是概念性的,位模式沒有變化(如果沒有截斷)。]

EDIT 2:MSVC警告級別

當然,在MSVC的不同警告級別上警告的是開發人員的選擇。在我看來,他們關于簽名/無符號的平等與大/小比較的選擇是有意義的,這當然是完全主觀的:

-1 == -1意思是和-1 == (unsigned) -1-我覺得這是一個直觀的結果。

-1 < 2 指的是-1 < (unsigned) 2-乍一看,這是不那么直觀的,海事組織理應得到“早期”的警告。


查看完整回答
反對 回復 2019-07-02
?
守著星空守著你

TA貢獻1799條經驗 獲得超8個贊

=運算符只是按位進行比較(通過簡單除法查看它是否為0)。

比比較小/大的人更多地依賴于數字的符號。

4位示例:

1111=15?還是-1?

所以如果你有1111<0001.這是模棱兩可的.。

但如果你有1111=1111.這是一回事,盡管你不是故意的。


查看完整回答
反對 回復 2019-07-02
  • 3 回答
  • 0 關注
  • 345 瀏覽

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號