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];
}
すべての算術型はCで暗黙的に変換されます。キャストが必要になることは非常にまれです。通常、変換して1を法とし、小さい方の型の最大値を減らしたい場合、または算術を符号なしモードに強制して使用する必要がある場合のみです。符号なし算術のプロパティ。
個人的に、私はキャストを見ることを嫌います:
もちろん、いくつかの非常にうるさい警告レベルを有効にすると、暗黙の変換によって、正しい場合でも多くの警告が発生する可能性があります...
size_t key_index = (size_t)hash(key) % size;
結構です。あなたは実際にはキャストさえ必要としません:
size_t key_index = hash(key) % size;
同じことをします。
キャストの問題(前に述べたように必要ありません)の他に、コードで問題が発生する可能性のある、より複雑なことがいくつかあります。
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];
}
_