2010-09-04 135 views
27

如果我有一個int和一個爲size_t變量,我可以對它們進行比較,如:比較INT與爲size_t

int i=1; 
size_t y=2; 
if(i==y) 
do something.. 

或我必須類型轉換其中之一嗎?

+2

你真的需要一個'int'比作'的size_t '?通常你不應該這樣做,而且你可能會錯誤地將int轉換爲size_t或反之亦然。 – GameZelda 2010-09-04 11:19:47

+2

只是爲了知識:) – 2010-09-04 13:25:35

回答

43

如果int爲零或爲正值,則安全。如果是負數,並且size_t等於或高於int,那麼int將被轉換爲size_t,因此其負值將變爲正值。然後將這個新的正值與size_t的值相比較,這可能(以驚人的不太可能的巧合)給出誤報。要真正安全的(也許是怕事)檢查int非負第一:

/* given int i; size_t s; */ 
if (i>=0 && i == s) 

,並抑制編譯器警告:

if (i>=0 && (size_t)i == s) 
0

size_t將會是某種整數類型(儘管可能是未簽名的,所以可能會產生警告),所以適當的轉換應該自動完成。

正如其他人已經表示的那樣,如果計算所需的大小,您可能需要重新考慮產生int的任何計算結果,看看您是否可以在size_t中首先執行計算。

+13

'size_t' *必須*無符號。 – 2010-09-04 11:32:18

+0

實際上,無符號類型會產生比解決問題更多的問題(用於大小時)。一個更好的建議是儘快遠離未簽名的數量(轉換爲「int」)。你可以在INT_MAX值附近遇到問題,但是如果沒有簽名,你可以在零點附近出現問題,這在編程中更常見。 – 6502 2017-08-29 06:34:56

0

可以比較size_t值與int值,int值將被隱式轉換爲unsigned類型。

有些編譯器會在比較中混合使用signedunsigned類型時發出警告。在這種情況下,您可以明確地將signed值轉換爲合適的unsigned類型以禁止警告。

+3

只是掩蓋這樣的編譯器警告,國際海事組織通常不是一個好主意。有更好的選擇(例如,首先使用'size_t'或'int'之一而不是兩者)。 – strager 2010-09-04 11:27:01