ラップアラウンドの処理はめんどう
32ビット値でインデックスとオフセットを受け取って、対象のアドレスになんかの操作をするような関数があったとする。
とりあえず、インデックスは最大100までとすると、範囲が超えてないかチェックする必要がでてくるわけで。
bool test(unsigned int index, unsigned int offset) { //範囲チェック if(100 < index + offset) { //エラー return false; } //何かの処理 return true; }
これだと、index + offsetが32ビット値を超えるときに範囲内に戻っちゃうのでエラーにならない。
じゃぁ、一回64ビット値に入れればいいじゃないかと。
bool test(unsigned int index, unsigned int offset) { //範囲チェック long long targetIndex = index + offset; if(100 < targetIndex) { //エラー return false; } //何かの処理 return true; }
これ、ダメなんですよね。
せっかく64ビット変数を用意したのに、そこに入るのは32ビットの計算結果。
なのですでにラップアラウンドした後。
bool test(unsigned int index, unsigned int offset) { //範囲チェック long long targetIndex = index; targetIndex += offset; if(100 < targetIndex) { //エラー return false; } //何かの処理 return true; }
いったん64ビット値にしたあと、加算すればOK・・・だけどなんか汚いなぁ・・・。