2013-08-06 19 views
7

範囲外であるIはC(ここで関連するセクション)でこのコードをコンパイルするRVCTコンパイラを使用している:警告 - 整数演算結果がC

static void Test (void) 
{ 
    unsigned long regVal; 
    regVal |= (UINT32)( (0x1 << 31)  | 
          (0x1 << 26)  | 
          0x3E); 
} 

コードをコンパイルするとき、私は、次の警告警告を受けます: "#61-D:整数演算結果が範囲外です"。

警告を避けるために何を変更するかを理解したいと思います。

ありがとうございます!

+2

最初に 'regVal'を初期化するか、' = '演算子の代わりに '='演算子だけを割り当てることを検討してください。 – patrickvacek

+1

@patrickvacekそれは確かに有効な点ですが、私はそれがこの質問の要点ではないと考えています。 –

+0

私はそのコンパイラに精通していませんが、通常、その変数はランダムな値をとります。0に初期化されることはありません。 | =を=に変更しないでください。 – oyvind

答えて

7

整数の昇格規則のために、内側の式(つまり、(UINT32)の前)はsigned intとして扱われます。したがって、0x1 << 310x80000000です。これは負の符号付き整数なので、警告が表示されます。修正するには、0x1Uのように16進定数に 'U'を追加してシフトを強制的に符号なしにすることができます。

regVal |= (UINT32)( (0x1U << 31)  | 
         (0x1U << 26)  | 
         0x3EU); 

これは警告を取り除くべき、符号なしのようにシフトし、ビット単位の論理和のすべてを強制的に(そして、それはすでに符号なしなのでまた、(UINT32)キャストの必要性を取り除く)します。

+0

ありがとうございます。 Uを追加するとこの問題が解決しました –

2

式1 < < 31は符号付きintを表すため、コンパイラーのオーバーフローの警告は正しいです。警告を回避するには、Uの接尾辞を使用して定数0x1を符号なしの値として明示的に定義します。例:

unsigned long regVal; 
regVal |= (UINT32)( (0x1U << 31)  | 
         (0x1 << 26)  | 
         0x3E); 
関連する問題