データ型で扱える数値を超えたときの挙動について
公開日:2019年09月13日
byte型の数値
byte型の整数(1バイト:8ビット):-128~127まで扱える整数
確認用テストプログラム
ファイル名:OverFlowTest.java
class OverFlowTest { public static void main(String[] args) { byte num; num = 127; System.out.println("num:" + num); num++; System.out.println("num:" + num); num++; System.out.println("num:" + num); num++; System.out.println("num:" + num); System.out.println("-----------"); num = -127; System.out.println("num:" + num); num--; System.out.println("num:" + num); num--; System.out.println("num:" + num); num--; System.out.println("num:" + num); } }
コマンドプロンプトで実行結果確認
c:\java\test>javac OverFlowTest.java c:\java\test>java OverFlowTest num:127 num:-128 num:-127 num:-126 ----------- num:-127 num:-128 num:127 num:126
数値は内部ではビットで扱われています。
byte型の数値は「1バイト」で扱える数値です。
1バイトは8ビット。つまり2進数で8桁の数値になります。
8桁の0と1の組み合わせで扱える数字は「-128~127」の計256とおりの数字になります。
- 最上位ビット(8桁目)は正負の符号扱い:「0は正の整数」「1は負の整数」
- 残りの7桁で数値を表す
正の整数 | 負の整数 | ||
---|---|---|---|
10進数 | 2進数 | 10進数 | 2進数 |
1 | 00000001 | -1 | 11111111 |
※正の整数が127までなのは「0」が正の整数に組み込まれているから
正の整数 | 負の整数 | ||
---|---|---|---|
10進数 | 2進数 | 10進数 | 2進数 |
0 | 00000000 | 0 | 00000000 |
1 | 00000001 | -1 | 11111111 |
2 | 00000010 | -2 | 11111110 |
3 | 00000011 | -3 | 11111101 |
4 | 00000100 | -4 | 11111100 |
5 | 00000101 | -5 | 11111011 |
6 | 00000110 | -6 | 11111010 |
7 | 00000111 | -7 | 11111001 |
8 | 00001000 | -8 | 11111000 |
: | : | ||
120 | 01111000 | -120 | 10001000 |
121 | 01111001 | -121 | 10000111 |
122 | 01111010 | -122 | 10000110 |
123 | 01111011 | -123 | 10000101 |
124 | 01111100 | -124 | 10000100 |
125 | 01111101 | -125 | 10000011 |
126 | 01111110 | -126 | 10000010 |
127 | 01111111 | -127 | 10000001 |
128(表示:-128) | 10000000 | -128 | 10000000 |
129(表示:-127) | 10000001 | -129(表示:127) | 01111111 |
130(表示:-126) | 10000010 | -130(表示:126) | 01111110 |
131(表示:-125) | 10000011 | -131(表示:125) | 01111101 |
132(表示:-124) | 10000100 | -132(表示:124) | 01111100 |
133(表示:-123) | 10000101 | -133(表示:123) | 01111011 |
134(表示:-122) | 10000110 | -134(表示:122) | 01111010 |
135(表示:-121) | 10000111 | -135(表示:121) | 01111001 |
136(表示:-120) | 10001000 | -136(表示:120) | 01111000 |
最上位ビット(8桁目)は正負の符号
「127」を表す2進数「01111111」を「1」増やすと「128」になり2進数では桁が上がって「10000000」になります。
「128」を表す2進数「10000000」はbyte型では「-128」を表す2進数「10000000)」になってしまいます。
あふれた桁のビットは削除される
「-128」を表す2進数「10000000」を「1」減らすと「-129」になり2進数では桁が下がって「01111111」になります。
2進数「01111111」はbyte型では正の整数「127」を表します。
面白いサンプル
public class OverflowRoop { public static void main(String[] args) { int i = 1; for (; i >= 0; i++) { System.out.println(i); } System.out.println(i); } }
同じカテゴリーのコンテンツ