Javaプログラミング:Integerの取値範囲(-2^31~2^31-1)分析
3015 ワード
JavaでIntegerの最小値、最大値は次のように定義されます.
最小値は-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」はいずれも符号化の形式であり、元の符号に変換することでそれらの真実値を取得する.
変換式:原号が正数である場合、正数の原号、逆符号、補符号は同じである.
正数: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進数の整形数を定義すると、
最大値はなぜ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と推定される.
/**
* 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原号: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と推定される.