2011-03-30 69 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