如果一個人需要用unsigned int y
這是更安全/更好/在C99
更好的與gcc 4.4+
比較int x
:Compare int和unsigned int類型
(unsigned int)x == y
x == (int)y
什麼關係呢?
如果一個人需要用unsigned int y
這是更安全/更好/在C99
更好的與gcc 4.4+
比較int x
:Compare int和unsigned int類型
(unsigned int)x == y
x == (int)y
什麼關係呢?
最安全的是檢查的數量範圍內鑄造前:
if (x >= 0 && ((unsigned int)x) == y)
謝謝,當我們確定'y
是的,這是可以的,而且鍵入的速度可能更快(並且在編譯器不是非常優化的時候執行) –
您不應該進行轉換並讓編譯器選擇。 「通常的算術轉換」的規則有點複雜,但實質上有一些架構將轉換爲「int」,而其他架構則轉換爲「無符號」,原因很充分。 –
是的,這很重要。
在具有32位int
的平臺上,
int x = -1;
unsigned y = 0xffffffff;
表達x == y
將產生1
因爲通過「通常的算術轉換」的x
的值被轉換爲unsigned
並因此0xffffffff
。
表達式(unsigned int)x == y
也是1
。唯一的區別是你用轉換明確地進行了轉換。
表達x == (int)y
將最有可能1
以及因爲轉換0xffffffff
到int
產量-1
在大多數平臺(補底片)。嚴格地說,這是實現定義的行爲,因此可能在不同的平臺上有所不同。
請注意,在任何情況下您都將得到「預期」結果0
。在Mark Byers' answer中給出了一個很好的實現。
除了溢出情況(> = MAX_UINT/2,即MAX_INT,即32位機器上的2 ** 31),它通常並不重要。 –
@BasileStarynkevitch:但這大約有50%的可能值!更重要的是什麼? –
我同意,但溢出測試並沒有真正的自然感......(並且測試在機器內部仍然是一樣的)。所以它仍然沒有關係...機器代碼大致相同... –