2011-03-30 55 views
10

什麼是轉換的正確方法/施放一個int在C99一size_t上32位和64位Linux平臺?C:投INT爲size_t

實施例:

int hash(void * key) { 
    //... 
} 

int main (int argc, char * argv[]) { 
    size_t size = 10; 
    void * items[size]; 
    //... 
    void * key = ...; 
    // Is this the right way to convert the returned int from the hash function 
    // to a size_t? 
    size_t key_index = (size_t)hash(key) % size; 
    void * item = items[key_index]; 
} 
+0

我不明白爲什麼這是行不通的。 – slartibartfast 2011-03-30 02:01:54

+0

什麼是與一般的普通鑄鐵'(爲size_t)'的問題嗎?它有點不合適嗎? – AnT 2011-03-30 02:02:32

+0

是啊,這是正確的,但我認爲這是隱式轉換,所以你不會真的* *需要'(爲size_t)'。 – 2011-03-30 02:02:38

回答

15

所有的算術類型隱式轉換在C.這是非常罕見的,你需要一個投 - 通常只有當你要轉換下來,降低模1加較小型的最大值,或者當您需要強制算術成無符號模式使用無符號算術的屬性。

就個人而言,我不喜歡眼看蒙上因爲:

  1. 他們醜陋的視覺混亂,並
  2. 他們建議我說,誰寫的代碼是獲取有關類型的警告,並在石膏扔的人在不理解警告的原因的情況下關閉編譯器。

當然,如果您啓用了一些超挑剔的警告級別,你的隱式轉換可能導致大量的,即使他們是正確的警告......

從鑄造發行
5
size_t key_index = (size_t)hash(key) % size; 

是好的。你其實不需要演員:

size_t key_index = hash(key) % size; 

做同樣的事情。

3

除了(你不如前所述),還有一些錯誤的代碼可能會出錯。

如果hash()應該返回一個數組的索引,它也應該返回一個size_t。因爲它不,你可能會得到奇怪的效果時key_indexINT_MAX大。

我要說的是sizehash()key_index應該都是同一類型的,可能size_t可以肯定的,例如:

size_t hash(void * key) { 
    //... 
} 

int main (int argc, char * argv[]) { 
    size_t size = 10; 
    void * items[size]; 
    //... 
    void * key = ...; 

    size_t key_index = hash(key) % size; 
    void * item = items[key_index]; 
} 
+0

我能找到什麼在制約數組索引不到'INT_MAX' C99標準。如果你得到奇怪的效果,這是一個編譯器錯誤。很明顯,在給出'10 JeremyP 2015-05-28 13:38:45