次の (疑似 C++) コードがあるとします。
float x=100, a=0.1;
unsigned int height = 63, width = 63;
unsigned int hw=31;
for (int row=0; row < height; ++row)
{
for (int col=0; col < width; ++col)
{
float foo = x + col - hw + a * (col - hw);
cout << foo << " ";
}
cout << endl;
}
(col - hw) が負の場所で、配列の半分の foo の値が台無しになります。col は int で最初に来るので、式のこの部分が int に変換されて負になると考えました。残念ながら、そうではないようです。符号なしの値のオーバーフローが発生し、その理由がわかりません。
この問題を解決するにはどうすればよいですか? 式の全体または一部にキャストを使用しますか? どのタイプのキャスト (C スタイルまたは static_cast<...>) ですか? キャストの使用にオーバーヘッドはありますか (高速に動作させるにはこれが必要です!)?
編集:すべての unsigned int を通常の整数に変更しましたが、この状況でなぜそのオーバーフローが発生したのか疑問に思っています。