在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];
}
答案 0 :(得分:15)
所有算术类型都在C中隐式转换。很少需要转换 - 通常只有当你想要转换时,减少模1加上较小类型的最大值,或者当你需要强制算术进入无符号时模式使用无符号算术的属性。
就个人而言,我不喜欢看演员,因为:
当然,如果你启用了一些超级挑剔的警告级别,你的隐式转换可能会引起很多警告,即使它们是正确的......
答案 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
时,您可能会产生奇怪的效果。
我会说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];
}