2021. 5. 15. 23:54ㆍJava/Practice
데이터 자료형의 범위는 어떻게 구해지며 범위는 어떻게 계산되는 것일까??
데이터 자료형은 여러 가지가 존재하지만 확인하기 편한 정수형 자료형을 가지고서 확인해 보자.
자세한 데이터 유형 JAVA 변수(Variable) 및 데이터 유형(Data Type)을 참고.
음수를 포함한 정수형 자료형의 범위의 표현은 2의 보수 (Two`s complement)의 표현 범위로 나타내는데 이것 역시 프로그램에서 음수 표현 방식 여기를 참고하면 된다.
각설하고, 데이터의 표현 범위는 -2n-1 ~ 2n-1-1 이다. (n은 bit 단위(1byte = 8bit)로 계산)
자료형 | 메모리 | 계산식 | 정수 표현 범위 |
byte | 1 Byte (8bit) | -27 ~ 27-1 | -128 ~ 127 |
short | 2 Byte (16bit) | -215 ~ 215-1 | -32768 ~ 32767 |
int | 4 Byte (32bit) | -231 ~ 231-1 | -2147483648 ~ 2147483647 |
long | 8 Byte (64bit) | -263 ~ 263-1 | -922337036854775808 ~ 9223372036854775807 |
만약 각각 자료형의 정수 표현 범위를 넘어가면 어떻게 될까??
-128에 -1을 해서 -129 되거나 127에 +1을 해서 128이 되면 byte 값은 어떻게 될까?
결과부터 확인해 보자!!
byte byteValue = 128; //참고로 직접대입은 안됨 - 오류발생!!
byte byteMax = Byte.MAX_VALUE; // 127
System.out.println( ++byteMax ); // 결과값 : -128
byte byteMin = Byte.MIN_VALUE; // -128
System.out.println( --byteMin ); // 결과값 : 127
위에서 보는 것처럼 연산을 하게 되면 표현 범위를 넘어 오류가 날 줄 알았던 것과는 반대로 정상적으로 byte 값이 출력되는 것을 확인할 수 있다.
특이한 점은 결괏값이 다르게 나온 것인데 이것은 2진수로 계산해 보면 확인할 수 있다.
1) byte최댓값(127)에 1을 더한 경우
0111 1111 (127)
+ 0000 0001 (1)
--------------------------
= 1000 0000 (-128)
이건 OK!!
2) byte최솟값(-128)에 1을 뺀 경우
참고로 프로그램에서 뺄셈 연산은 존재하지 않기 때문에 2의 보수를 통한 덧셈 연산으로 계산함
1000 0000 (-128)
+ 1111 1111 (-1)
--------------------------
= 1 0111 1111 (127?)
이건 먼가 이상하다 8Bit를 넘어갔는데??
이 부분은 형 변환(casting)과 연관되어 byte의 단위인 8bit까지만 가지고 판단하기 때문에 0111 1111 = 127이 되는 것이다.
형 변환 시 주의해야 할 사항이기도 한데 큰 자료형을 작은 자료형으로 형 변환 시에는 값이 정상적으로 입력되지 않을 수 있다.
결론적으로,
각 자료형에 무한대로 + 또는 - 연산을 하게 되면
결국 표현 범위를 무한적으로 도는 것이라는 걸 알 수 있다.
실제로 각 자료형의 데이터 범위 초과로 오류는 나지 않고 값만 변경되기 때문에 디버깅이 어려우며 일일이 값을 확인하면서 디버깅해야 하는 부분이 발생함으로 이 부분을 고려해서 데이터 선언을 해서 사용해야 한다.
'Java > Practice' 카테고리의 다른 글
Java Collection 빠르게 사용하기 ( feat. Big O ) (0) | 2021.10.15 |
---|