検索

ホームページ  >  に質問  >  本文

C++位移运算符左移怎么计算出int(有符号)所能表示的最大值?

我尝试使用了1<<31,结果得到的值是int的最小值。。。
这是为什么?

巴扎黑巴扎黑2805日前655

全員に返信(6)返信します

  • 怪我咯

    怪我咯2017-04-17 14:29:46

    ここでのデフォルトの 1 は int なので、 类型。而你的编译环境下,int` は 32 ビットです。
    この 1 のバイナリ表現は

    となります。 リーリー

    32 ビット左シフト後

    リーリー

    int タイプなので署名されています。したがって、最初のビットは符号ビットであり、負の数になります。なぜintの最小値なのかというと、補数で表現されているからです。

    最大値を超える必要がある場合は、次の方法を使用してください

    リーリー

    -1 のバイナリ表現は 0xffffffff であるためです。 unsigned 型に変換してからシフトすると、符号ビットの影響はありません。

    返事
    0
  • 怪我咯

    怪我咯2017-04-17 14:29:46

    最大の int は 2 の 31 乗 - 1 です。1<<31 は範囲外であり、最小の負の数から逆算されます

    返事
    0
  • PHP中文网

    PHP中文网2017-04-17 14:29:46

    32 ビット int の場合、31 ビットを左にシフトすると最上位ビットに到達します。
    符号付き数値の場合、最上位ビットは符号ビットであり、0 は正、1 は負であるため、それが最小値になります。具体的な理由は、int がどのように保存されているかを見てください

    返事
    0
  • 阿神

    阿神2017-04-17 14:29:46

    (1 << 31) - 1 : signed int の最大値
    (1 << 31) 1 : signed int の最小値

    ((unsigned int)1<<32)-1: unsigned int の最大値
    0: unsigned int の最小値

    返事
    0
  • 阿神

    阿神2017-04-17 14:29:46

    テストしてみました:

    リーリー

    コンピレーション: gcc test.c -o test

    実行: ./test

    結果:

    リーリー

    返事
    0
  • PHP中文网

    PHP中文网2017-04-17 14:29:46

    お兄さん、符号ビットを削除して 30 ビットシフトしてください

    返事
    0
  • キャンセル返事