15

在 32 位和 64 位 linux 平台上在 C99中转换/转换int为 a的正确方法是什么?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];
}
4

3 回答 3

18

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

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

  1. 它们是丑陋的视觉混乱,并且
  2. 他们向我建议编写代码的人收到有关类型的警告,并在不了解警告原因的情况下进行强制转换以关闭编译器。

当然,如果您启用一些超挑剔的警告级别,即使它们是正确的,您的隐式转换也可能会导致大量警告......

于 2011-03-30T02:57:23.887 回答
5
size_t key_index = (size_t)hash(key) % size;

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

size_t key_index = hash(key) % size;

做同样的事情。

于 2011-03-30T02:13:25.047 回答
3

除了铸造问题(您不需要如前所述)之外,还有一些更复杂的事情可能会导致代码出错。

如果hash()应该返回数组的索引,它也应该返回 a size_t。因为它没有,所以当key_index大于时,您可能会得到奇怪的效果INT_MAX

我会说size, hash(),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];
}
于 2012-05-15T07:33:30.590 回答