1. 정수형 - byte, short, int, long
정수형에는 모두 4개의 자료형이 있으며, 크기순으로 나열하면 다음과 같다.
byte(1byte) → short(2byte) → int(4byte) → long(8byte)
* 정수형의 기본 자료형(default data type)은 'int'이다.
2. 정수형의 표현 형식과 범위
모든 정수형은 부호 있는 정수이므로 왼쪽의 첫 번째 비트를 '부호 비트(sign bit)'로 사용하고, 나머지는 값을 표현하는데 사용한다.
S | n-1bit |
* S: 부호비트, n : 타입의 크기(단위: bit)
n비트로 표현할 수 있는 정수의 개수 : 2^n개 (=2^n-1개+2^n-1개)
n비트로 표현할 수 있는 부호 있는 정수의 범위 : -2^n-1 ~ 2^n-1-1
> 8비트로 표현하면?
8비트로 표현할 수 있는 정수의 개수 : 2^8개 (=2^7개+2^7개)
8비트로 표현할 수 있는 부호 있는 정수의 범위 : -2^7 ~ 2^7개 (-128 ~ 127)
3. 정수형의 오버플로우
만일 4bit 2진수의 최댓값인 '1111'에 1을 더하면 어떤 결과를 얻을까?
2진수 '1111'에 1을 더하면 '10000'이 되지만, 4bit로는 4자리의 2진수만 저장할 수 있기에 '0000'이 된다. 이처럼 연산과정에서 해당 타입이 표현할 수 있는 값의 범위를 넘어서는 것을 오버플로우(overflow)라고 한다.
- 오버플로우 공식
최댓값+1 → 최솟값
최솟값-1 → 최댓값
부호 있는 정수의 오버플로우
부호 없는 정수와 부호 있는 정수는 표현 범위(최댓값과 최솟값)가 다르기 때문에 오버플로우가 발생하는 시점이 다르다. 부호 없는 정수는 2진수로 '0000'이 될 때 오버플로우가 발생하고, 부호 있는 정수는 0에서 1이 될 때 오버플로우가 발생한다.
class OverflowEx {
public static void main(String[] args) {
short sMin = -32768;
short sMax = 32767;
char cMin = 0;
char cMax = 65535;
System.out.println("sMin :: " + sMin);
System.out.println("sMin-1 :: " + (short)(sMin-1));
System.out.println("sMax :: " + sMax);
System.out.println("sMax+1 :: " + (short)(sMax+1));
System.out.println("cMin :: " + (int)cMin);
System.out.println("cMin-1 :: " + (int)--cMin);
System.out.println("cmax :: " + (int)cMax);
System.out.println("cmax+1 :: " + (int)++cMax);
System.out.println((int)Character.MAX_VALUE);
System.out.println((int)Character.MIN_VALUE);
}
}
참고문헌 : 남궁성(2016), Java의 정석, 도우출판