숫자 사용하기

이재홍 http://www.pyrasis.com 2014.12.17 ~ 2015.02.07

오버플로우와 언더플로우

각 자료형에서 저장할 수 있는 최대 크기를 넘어서면 오버플로우(Overflow), 최소 크기보다 작아지면 언더플로우(Underflow)라고 합니다. 이번에는 Go 언어에서의 오버플로우와 언더플로우에 대해 알아보겠습니다.

먼저 오버플로우 상황을 위해 부호 없는 정수의 최댓값을 저장해보겠습니다. 각 자료형의 최댓값은 math 패키지의 MaxUint8, MaxUint16, MaxUint32, MaxUint64 등의 상수를 사용하면 됩니다. 즉 math 패키지에는 자료형 별로 모든 값이 준비되어 있습니다.

package main

import "fmt"
import "math"

func main() {
	var num1 uint8 = math.MaxUint8
	var num2 uint16 = math.MaxUint16
	var num3 uint32 = math.MaxUint32
	var num4 uint64 = math.MaxUint64

	fmt.Println(num1) // 255
	fmt.Println(num2) // 65535
	fmt.Println(num3) // 4294967295
	fmt.Println(num4) // 18446744073709551615
}

부호 없는 정수의 최댓값에 1을 더한 뒤 컴파일을 하면 컴파일 에러가 발생합니다. 즉 Go 언어에서는 오버플로우 상황을 허용하지 않습니다.

package main

import "fmt"
import "math"

func main() {
	var num1 uint8 = math.MaxUint8 + 1   // 오버플로우 컴파일 에러 발생
	var num2 uint16 = math.MaxUint16 + 1 // 오버플로우 컴파일 에러 발생
	var num3 uint32 = math.MaxUint32 + 1 // 오버플로우 컴파일 에러 발생
	var num4 uint64 = math.MaxUint64 + 1 // 오버플로우 컴파일 에러 발생
}

부호 없는 정수의 최솟값은 0이며 Math 패키지에 따로 정의되어 있지 않습니다. 다음과 같이 부호 없는 정수형 변수에 음수를 저장해도 컴파일 에러가 발생합니다.

package main

import "fmt"

func main() {
	var num1 uint8 = 0 - 1  // 오버플로우 컴파일 에러 발생
	var num2 uint16 = 0 - 1 // 오버플로우 컴파일 에러 발생
	var num3 uint32 = 0 - 1 // 오버플로우 컴파일 에러 발생
	var num4 uint64 = 0 - 1 // 오버플로우 컴파일 에러 발생
}

Go 언어 컴파일러는 언더플로우 상황도 오버플로우 컴파일 에러로 표시합니다.

부호 있는 자료형의 최댓값은 math 패키지의 MaxInt8, MaxInt16, MaxInt32, MaxInt64이며 최솟값은 MinInt8, MinInt16, MinInt32, MinInt64입니다. 마찬가지로 부호 있는 자료형도 최솟값과 최댓값을 넘어서면 오버플로우 컴파일 에러가 발생합니다.


저작권 안내

이 웹사이트에 게시된 모든 글의 무단 복제 및 도용을 금지합니다.
  • 블로그, 게시판 등에 퍼가는 것을 금지합니다.
  • 비공개 포스트에 퍼가는 것을 금지합니다.
  • 글 내용, 그림을 발췌 및 요약하는 것을 금지합니다.
  • 링크 및 SNS 공유는 허용합니다.

Published

01 June 2015