while ((1U << i) < nSize) {
i++;
}
1U
の代わりにを使用する特別な理由はありますか1
?
ベストアンサー1
ほとんどのコンパイラでは、どちらも同じ表現の結果を返します。ただし、C仕様によると、符号付き引数のビットシフト演算の結果は実装定義の結果となるため、理論 1U << i
は よりも移植性に優れています1 << i
。実際には、すべての C コンパイラは、符号付き左シフトを符号なし左シフトと同じように扱います。
もう 1 つの理由は、nSize
が符号なしの場合、それを符号付きと比較すると1 << i
コンパイラ警告が生成されることです。1
を1U
に変更すると警告メッセージが表示されなくなり、 が 31 または 63 の場合に何が起こるかを心配する必要がなくなりますi
。
1U
コードに警告が表示される理由は、おそらくコンパイラの警告です。ほとんどの警告をオンにして C をコンパイルし、コードを変更して警告メッセージを排除することをお勧めします。