web-dev-qa-db-ja.com

C:intをsize_tにキャストします

32ビットと64ビットの両方のLinuxプラットフォームでC99でintsize_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];
}
12
user369450

すべての算術型はCで暗黙的に変換されます。キャストが必要になることは非常にまれです。通常、変換して1を法とし、小さい方の型の最大値を減らしたい場合、または算術を符号なしモードに強制して使用する必要がある場合のみです。符号なし算術のプロパティ。

個人的に、私はキャストを見ることを嫌います:

  1. 彼らは醜い視覚的な混乱であり、そして
  2. 彼らは、コードを書いた人が型についての警告を受けていて、警告の理由を理解せずにコンパイラをシャットダウンするためにキャストを投げ込んだことを私に示唆しています。

もちろん、いくつかの非常にうるさい警告レベルを有効にすると、暗黙の変換によって、正しい場合でも多くの警告が発生する可能性があります...

15
R..
size_t key_index = (size_t)hash(key) % size;

結構です。あなたは実際にはキャストさえ必要としません:

size_t key_index = hash(key) % size;

同じことをします。

5
Stephen Canon

キャストの問題(前に述べたように必要ありません)の他に、コードで問題が発生する可能性のある、より複雑なことがいくつかあります。

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];
}
_
3
Tim