2011-11-22 186 views
8

如果一個人需要用unsigned int y這是更安全/更好/在C99更好的與gcc 4.4+比較int xCompare int和unsigned int類型

  1. (unsigned int)x == y
  2. x == (int)y

什麼關係呢?

+0

除了溢出情況(> = MAX_UINT/2,即MAX_INT,即32位機器上的2 ** 31),它通常並不重要。 –

+2

@BasileStarynkevitch:但這大約有50%的可能值!更重要的是什麼? –

+0

我同意,但溢出測試並沒有真正的自然感......(並且測試在機器內部仍然是一樣的)。所以它仍然沒有關係...機器代碼大致相同... –

回答

16

最安全的是檢查的數量範圍內鑄造前:

if (x >= 0 && ((unsigned int)x) == y) 
+0

謝謝,當我們確定'y Cartesius00

+0

是的,這是可以的,而且鍵入的速度可能更快(並且在編譯器不是非常優化的時候執行) –

+0

您不應該進行轉換並讓編譯器選擇。 「通常的算術轉換」的規則有點複雜,但實質上有一些架構將轉換爲「int」,而其他架構則轉換爲「無符號」,原因很充分。 –

7

是的,這很重要。

在具有32位int的平臺上,

int x = -1; 
unsigned y = 0xffffffff; 

表達x == y將產生1因爲通過「通常的算術轉換」的x的值被轉換爲unsigned並因此0xffffffff

表達式(unsigned int)x == y也是1。唯一的區別是你用轉換明確地進行了轉換。

表達x == (int)y將最有可能1以及因爲轉換0xffffffffint產量-1在大多數平臺(補底片)。嚴格地說,這是實現定義的行爲,因此可能在不同的平臺上有所不同。

請注意,在任何情況下您都將得到「預期」結果0。在Mark Byers' answer中給出了一個很好的實現。

相關問題