在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];
}
发布于 2011-03-30 10:57:24
所有算术类型都在C中隐式转换。你很少需要强制转换--通常只有当你想要向下转换,减少模1加上较小类型的最大值时,或者当你需要强制算术进入无符号模式以使用无符号算术的属性时。
就我个人而言,我不喜欢看到投射,因为:
当然,如果您启用了一些超挑剔的警告级别,您的隐式转换可能会导致许多警告,即使它们是正确的……
发布于 2011-03-30 10:13:25
size_t key_index = (size_t)hash(key) % size;
很好。你甚至不需要演员阵容:
size_t key_index = hash(key) % size;
做同样的事情。
发布于 2012-05-15 15:33:31
除了类型转换问题(如前面所述,您不需要)之外,代码中还可能出现一些更复杂的问题。
如果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];
}
https://stackoverflow.com/questions/5481067
复制相似问题