홍카나의 공부방

[Go] 정수 타입 변환 - 왜 두 정수의 값이 다른가요? 본문

Programming Language/Go

[Go] 정수 타입 변환 - 왜 두 정수의 값이 다른가요?

홍문관카페나무 2024. 8. 29. 11:54

 

정수 간의 타입 변환시 유의할 점이 있다. 큰 범위를 갖는 타입에서 작은 범위를 갖는 타입으로 변환하면 값이 달라질 수 있다는 것이다. 아래 Go언어 코드 예제로 살펴보자.

 

package main

import "fmt"

func main() {
	var a int32 = 360
	var b int8 = int8(a)

	fmt.Println(a)
	fmt.Println(b)
}

 

출력함수인 fmt.Println(a)와 fmt.Println(b)의 결과는 어떻게 될까?

 

360

104

 

이렇게 다른 숫자가 출력된다. 아니 왜?

 

 

int8은 8비트를 표현할 수 있는 정수 타입으로, 표현가능한 값의 범위는 -128~127이 된다. 그리고 int32는 32비트를 표현할 수 있는 정수 타입으로, 대략 -2^31~2^31의 값을 표현할 수 있다. 정수 360의 값은 메모리에 아래와 같이 저장이 되어있을 것이다.

 

그리고 360의 값을 int8 타입에 맞추려면 앞에 24비트 가량이 짤리게 된다. 변환 과정에서 오버플로우가 발생하는 것이다. 아래 그림처럼 말이다.

 

그래서 01101000(2)의 값인 104가 저장이되고, 출력되는 것이다. 정수간 타입 변환시에 이 점을 유의해야 한다. 또한 Go언어는 실수에서 정수로 변환할 때 반올림이나 올림처리가 아닌, 소숫점 버림을 택한다는 것도 기억해두자.

 

큰 범위에서 작은 범위로 정수간 타입 변환시 상위 비트를 다 잘라낸다는 것은 C++에서도 똑같다.

#include <iostream>
using namespace std;

int main() {
    int32_t a = 360;          // 32비트 정수 a에 360 저장
    int8_t b = int8_t(a);    // a를 8비트 정수로 변환
    cout << b << endl;       // b의 값을 출력
    return 0;
}

 

이 결과도 104가 출력된다.

 


 

 

 

예제 출처 = <Tucker의 Go언어 프로그래밍 2판>

 

반응형