1

を渡すn = 0x0と 、単語をシフトする0xffffffffと予想される画面が表示されます (xを無視してください!関数内では使用しませんでした。)0x0000000032 bits

void logicalShift(int x, int n) {
    int y = 32;
    int mask = 0xffffffff;
    printf("mask %x", mask << (y-n));
}

興味深い点の1つは、

void logicalShift(int x, int n) {
    int y = 32;
    int mask = 0xffffffff;
    printf("mask %x", mask << 32);
}

これは私が期待したものを出力します。私は何かを見逃していますか?ありがとうございました!

Ubuntuで実行しています

4

2 に答える 2

4

32 ビット値を 32 ビット左にシフトすると、結果は未定義になります。0 ~ 31 ビットのみをシフトできます。

ここも参照してください: 32 回以上使用すると、32 ビット整数の左ビットシフト "<<" が期待どおりに機能しないのはなぜですか?

于 2012-08-16T13:02:41.507 に答える
2

これは、 C11 ドラフト §6.5.7.3からの関連する引用です。

右オペランドの値が負の値であるか、昇格された左オペランドの幅以上である場合、動作は未定義です。

つまり、結果は未定義であり、コンパイラは自由に結果を生成できます。

于 2012-08-16T13:02:55.337 に答える