1. ホーム
  2. c

[解決済み] Cの1Uと1の違いはあるのでしょうか?

2022-02-07 08:06:09

質問内容

    while ((1U << i) < nSize) {
        i++;
    }

を使用する特別な理由はありますか? 1U の代わりに 1 ?

解決方法は?

ほとんどのコンパイラでは、どちらも同じ表現で結果を出します。 しかし、C言語仕様では、符号付き引数に対するビットシフト演算の結果は、実装で定義された結果を与えることになっています。 理論 1U << i の方が、よりポータブルです。 1 << i . 実際には、すべてのCコンパイラは、符号付き左シフトを符号なし左シフトと同じように扱います。

もう一つの理由は、もし nSize が符号なしである場合、それを符号ありの 1 << i は、コンパイラの警告を発生させます。 そのため 1 から 1U を使えば警告メッセージは表示されませんし、もし i が31または63の場合。

コンパイラの警告が原因である可能性が高いです。 1U が表示されます。 ほとんどの警告をオンにした状態でCをコンパイルし、コードを変更することで警告メッセージをなくすことをお勧めします。