C:将int转换为size_t

时间:2011-03-30 01:59:48

标签: c casting int c99 size-t

在32位和64位Linux平台上,在C99中将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];
}

3 个答案:

答案 0 :(得分:15)

所有算术类型都在C中隐式转换。很少需要转换 - 通常只有当你想要转换时,减少模1加上较小类型的最大值,或者当你需要强制算术进入无符号时模式使用无符号算术的属性。

就个人而言,我不喜欢看演员,因为:

  1. 他们是丑陋的视觉混乱,
  2. 他们告诉我,编写代码的人正在收到关于类型的警告,并且在不了解警告原因的情况下抛出编译器来关闭编译器。
  3. 当然,如果你启用了一些超级挑剔的警告级别,你的隐式转换可能会引起很多警告,即使它们是正确的......

答案 1 :(得分:5)

size_t key_index = (size_t)hash(key) % size;

很好。你实际上甚至不需要演员:

size_t key_index = hash(key) % size;

做同样的事情。

答案 2 :(得分:3)

除了演员问题(你之前不需要)之外,还有一些更复杂的东西可能会出错。

如果hash()应该返回一个数组的索引,它也应该返回一个size_t。因为它没有,当key_index大于INT_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];
}