unsigned
タイプは純粋な悪だからです。
unsigned - int
in Cが生成するという事実unsigned
は、さらに悪いことです。
これは、私を何度も悩ませた問題のスナップショットです。
// We have odd positive number of rays,
// consecutive ones at angle delta from each other.
assert( rays.size() > 0 && rays.size() % 2 == 1 );
// Get a set of ray at delta angle between them.
for( size_t n = 0; n < rays.size(); ++n )
{
// Compute the angle between nth ray and the middle one.
// The index of the middle one is (rays.size() - 1) / 2,
// the rays are evenly spaced at angle delta, therefore
// the magnitude of the angle between nth ray and the
// middle one is:
double angle = delta * fabs( n - (rays.size() - 1) / 2 );
// Do something else ...
}
もうバグに気づきましたか?私は、デバッガーに介入した後にのみ見たことを告白します。
n
は unsigned 型であるためsize_t
、式全体がn - (rays.size() - 1) / 2
として評価されunsigned
ます。その式は、中央の光線から 3 番目の光線の符号付きの位置になるように意図されていますn
。左側の中央の光線から 1 番目の光線は位置 -1 になり、右側の最初の光線は位置 +1 になります。絶対値を取り、角度を掛けると、光線と中央の光線delta
の間の角度が得られます。n
残念ながら、上記の式には符号なしの悪が含まれており、たとえば -1 に評価される代わりに、2^32-1 に評価されました。その後の への変換によりdouble
、バグが封印されました。
算術演算の誤用によって引き起こされたバグが 1 つまたは 2 つ発生した後、unsigned
取得した余分なビットが余分な問題に見合う価値があるかどうか疑問に思うようになります。unsigned
バイナリマスクなどの非算術演算には引き続き使用しますが、可能な限り算術での型の使用を回避しようとしています。