2012-08-06 28 views
5

可能性の重複:
GCC left shift overflow予期しない左シフト動作

次最小限のプログラムを考えてみましょう。

#include <stdint.h> 
#include <stdio.h> 

int main() 
{ 
    uint32_t v = 1024; 
    v &= (((uint32_t)1 << 32) - 1); 
    printf("v = %u\n", v); 
    return 0; 
} 

私はMinGWの下GCCでコンパイルする予想と同じようにこれは1024を印刷します。左に32回シフトした1は再び0なので、0-1 = -1、つまり "1111 .... 1111"です。これは、任意の値とANDをとって同じ値を再度返す必要があります。

私は

#include <stdint.h> 
#include <stdio.h> 

int main() 
{ 
    unsigned int s = 32; 
    uint32_t v = 1024; 
    v &= (((uint32_t)1 << s) - 1); 
    printf("v = %u\n", v); 
    return 0; 
} 

にプログラムを変更する場合は、印刷結果が今0です。誰かがこの行動を説明できますか?

答えて

7

32ビット値を32ビットシフトすることは、Cでは未定義の動作です。実行しないでください。

+0

http://catb.org/jargon/html/N/nasal-demons.html –

6

シフト距離は型のビット幅より小さくなければならないため、どちらも未定義の動作です。定数では、gccのオプティマイザが期待通りに動作しますが、変数を使用すると、実行時にシフトが実行されます。おそらくシフト距離は31でマスクされているので、シフトは行われず、1 - 1 == 0となります。

関連する問題