Learning site for website creation

データ型で扱える数値を超えたときの挙動について

公開日: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);
    }
}