15

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];
}
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()配列へのインデックスを返すことになっている場合は、 asize_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 に答える