次のcコードを書きました:
#include <stdio.h>
int main () {
printf("%d\n", -1 >> 8);
return 0;
}
-m32 フラグを使用して、x86_64 で gcc 4.6.3 でこのコードをコンパイルします。予想どおり-1が出力されます。シフトは2の補数表現を使用して算術的に発生し、-1になります。
今、代わりに書くと
printf("%d\n", 0xFFFFFFFF >> 8);
私は 16777215 を取得します。この定数は int (符号付き) として解釈され、シフトは算術演算であり、結果は再び -1 になると予想していました。私は最新の C 標準に目を通しましたが、なぜそうなのか理解できないようです。何か案は?