次最小限のプログラムを考えてみましょう。
#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
です。誰かがこの行動を説明できますか?
http://catb.org/jargon/html/N/nasal-demons.html –