1

左シフトを 32 回実行しようとしたときに、有線の問題がいくつか見つかりました。テスト関数のコードは 0x0 の同じ結果を出力するはずですが、代わりに "ffffffff, 0" が得られました。誰でもコードの何が問題なのかヒントを与えることができますか? ありがとうございました!

int test(int n) {
    int mask = ~0 << (32 + ~n + 1);
    int mask1 = ~0 << (32 + ~0 + 1);
    printf("%x, %x\n", mask, mask1);
    return mask;
}

int main(){
    test(0);
}
4

2 に答える 2

4

intCでは、型サイズ(あなたの場合)より大きいサイズでのシフトは未定義の動作です

このトピックから: ISO C99 (6.5.7/4) からの関連引用

E1 << E2 の結果は、E1 左シフトされた E2 ビット位置です。空いたビットはゼロで埋められます。E1 が unsigned 型の場合、結果の値は E1 × 2 E2であり、結果の型で表現可能な最大値より 1 を法として減じられます。E1 が符号付きの型で負でない値を持ち、E1 × 2 E2が結果の型で表現できる場合、それが結果の値です。それ以外の場合、動作は未定義です。

于 2013-05-07T16:23:42.977 に答える
2

32 ビットの整数があると仮定すると、31 回を超える左シフトの結果は未定義です。

C11から§6.5.7 Bitwise shift operators

E1 << E2 の結果は、E1 左シフトされた E2 ビット位置です。空いたビットはゼロで埋められます。E1 が unsigned 型の場合、結果の値は E1 x 2E2 であり、結果の型で表現可能な最大値より 1 を法として少なくなります。E1 に符号付きの型と非負の値があり、E1 x 2E2 が結果の型で表現できる場合、それが結果の値です。それ以外の場合、動作は未定義です。

于 2013-05-07T16:25:09.687 に答える