[Java]오버플로우Overflow

Lia·2022년 10월 13일
0

☕️ Java

목록 보기
4/5

오버플로우를 너무 잘나타내는 짤

overflow/underflow란? 왜 발생하는 걸까?

  • Overflow (오버플로우) : 메모리의 표현 범위에서 벗어난 수의 값을 저장하는 경우
  • Underflow (언더플로우) : 메모리가 표현할 수 있는 수보다 적은 수의 값을 저장하는 경우

Java는 '정적언어'로 컴파일할 때 변수의 타입이 결정되기 때문에, 변수를 선언할 때에는 자료형을 별도로 지정해주어야 한다.
이처럼 정적언어에서의 자료형은 데이터를 표현할 수 있는 범위가 정해져 있기 때문에, 변수 범위 밖으로 넘어가게 되면 예상치 못한 값들이 반환되게 된다. 이 현상이 바로 Overflow와 Underflow 이다.

자료형의 범위

ex)정수의 오버플로우(이미지 출처: 자바의 정석)

😲 그럼 오버플로우가 왜 발생할까 ❓
2진수로 표현하면 오버플로우가 왜 발생했는 지 이해할 수 있다.

01111111[127] + 1 = 10000000[-128]이 되고,
반대로 -128에 1을 빼게 되면
10000000[-128] - 1 = 01111111[127]이 된다.

부호를 결정하는 맨 왼쪽 비트가 바뀌게 되니 이런 결과가 생기는 것이다.
오버플로우가 발생하는 공식이 있는데 자료형의 최대값에서 1을 더하면 최소값이 되고, 최소값에서 1을 빼면 최대값이 되버린다.

😲 음수를 2진수로 표현하려면 ❓
바로 '2의 보수법'을 통해 알아낼 수 있다.
2의 보수법을 취하는 방법은 아주 간단하다. 2진수 값을 모두 반전 시켜준 후, 1을 더해주는 방식이다.


양수 5를 2진수로 변환 시켜보자. 00000101이다.
0은 1로, 1은 0으로 반전 시키면 11111010이 된다.
그 다음 1을 더해주자. 11111011이 된다. 이 값이 컴퓨터에서는 -5를 뜻하는 2진수인 것이다.
그렇다면 -128은 2진수로 어떻게 변환해야 할까?
위와 같이 128의 2진수 값 10000000에서 1은 0으로 0은 1로 반전 시켜주자.
01111111이 된다. 여기서 1을 다시 더해주자.
10000000로 다시 원래의 값이 되었다.
그렇다. 앞에서 설명했듯이 맨 왼쪽의 비트가 1이면 음수가 되기 때문에 양수 128은 1바이트만으로 표현을 못하게 되는 상황이 생기고,
그로인해 10000000은 -128이 된다.
결론적으로 1byte 값의 범위는 10000000[-128] ~ 01111111[127]를 가지게 된다.

Overflow 가 일어나면 어떤 일이 생길 수 있을까?

Overflow 또는 Underflow가 발생하면 최상위 비트, 최하위 비트를 벗어난 데이터가 인접 비트를 덮어쓰는 잘못된 결과를 얻을 수 있다.
따라서 사용자는 오버플로우가 발생하지 않게 충분한 크기의 자료형을 선택해야 한다.

📍 Reference

[Java] 오버플로우, 언더플로우
My Magazine : 네이버 블로그

profile
꺾이지않기ᕙ༼*◕_◕*༽ᕤ

0개의 댓글