Hatena::ブログ(Diary)

Dive to the Software このページをアンテナに追加 RSSフィード Twitter

はてなRSSに追加

2011-04-25 ラップアラウンドの処理はめんどう

[]ラップアラウンドの処理はめんどう

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・・・だけどなんか汚いなぁ・・・。

まものまもの 2011/04/28 00:45 キャストしてもだめなん?
long long targetIndex = (long long)index + offset;

cjohncjohn 2011/05/16 15:55 キャストはキャストで汚くなるしなーとかとか・・・

スパム対策のためのダミーです。もし見えても何も入力しないでください
ゲスト


画像認証

トラックバック - http://d.hatena.ne.jp/cjohn/20110425/1303735176