Javaプログラミング:Integerの取値範囲(-2^31~2^31-1)分析


JavaでIntegerの最小値、最大値は次のように定義されます.
/**
 * A constant holding the minimum value an {@code int} can
 * have, -231.
 */
@Native public static final int   MIN_VALUE = 0x80000000;

/**
 * A constant holding the maximum value an {@code int} can
 * have, 231-1.
 */
@Native public static final int   MAX_VALUE = 0x7fffffff;

最小値は-2^31、最大値は2^31-1ですが、なぜですか?導出プロセスは次のとおりです.
Integerが実際に占有するバイナリコードのビット数
1つのIntegerタイプは4バイト、1つのバイトは8ビットのバイナリコードを占めているため、1つのIntegerは合計32ビットのバイナリコードを占めています.1位の符号ビットを除いて、31ビットが数値を表す.
Count
コンピュータでは、データはバイナリ符号化によって格納され、Java符号で見られる「0 x 8000000」、「0 x 7 fffffff」はいずれも符号化の形式であり、元の符号に変換することでそれらの真実値を取得する.
MIN_VALUE = 0x80000000;  //  
MAX_VALUE = 0x7fffffff;  //  

変換式:
  • 原号が正数である場合、正数の原号、逆符号、補符号は同じである.

  • 正数:1原数:0000 0000 0000 0000 0000 0000 0000 0000 0001反符号:0000 0000 0000 0000 0000 0000 0000 0000 0001補符号:0000 0000 0000 0000 0000 0000 0000 0001
  • 原号が負数である場合、逆符号は符号ビットを除去してビットで逆を取り、符号ビットを除去してビットで逆を取り、さらに1を加える.

  • 負数:-1原号:1000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0001逆符号:1111 1111 1111 1111 1111 1110補符号:1111 1111 1111 1111 1111 1111 1111 1111 1111 1111
    したがって、プログラムでは、16進数の整形数を定義すると、0x00000001は10xFFFFFFFFは−1を表す.
    最大値はなぜ2^31-1なのか、2^31ではありません
    コード:0111 1111 1111 1111 1111 1111 1111 1111反コード:0111 1111 1111 1111 1111 1111 1111補コード:0111 1111 1111 1111 1111補コード:0111 1111 1111 1111 1111 1111 1111 1111 1111
    コンピュータで表すことができる整数の最大値の符号化は「0111 1111 1111 1111 1111 1111 1111 1111 1111」であり、正数の符号化は原符号と一致し、原符号も「0111 1111 1111 1111 1111 1111 1111 1111 1111 1111」であり、10進数2^31-1に変換される.
    最小値はなぜ-2^31なのか、-(2^31-1)ではありません.
    次のように負の数値を順に推定します.
    コード:1000,000,000,000,000,000,000,000,000,000,000,000,000,000,000補コード:1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1111
    コード:1000 0000 0000 0000 0000 0000 0010-2反コード:1000 0000 0000 0000 0000 0000 0000 0000 0001補コード:1111 1111 1111 1111 1111 1111 1111 1111 1111 1111 1110
    コード:1111 1111 1111 1111 1111 1111 1111 1111 1111 1111-2^31+1逆コード:1111 1111 1111 1111 1111 1111 1111 1111 1110補コード:1000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000 0000
    コード:1000,000,000,000,000,000,000,000,000,000,000-0約定は-2^31反コード:1111 1111 1111 1111 1111 1111 1111補コード:1000,000,000,000,000,000,000,000,000,000,000
    これにより,Integerの最小値は−2^31と推定される.