Notice
Recent Posts
Recent Comments
Link
일 | 월 | 화 | 수 | 목 | 금 | 토 |
---|---|---|---|---|---|---|
1 | 2 | |||||
3 | 4 | 5 | 6 | 7 | 8 | 9 |
10 | 11 | 12 | 13 | 14 | 15 | 16 |
17 | 18 | 19 | 20 | 21 | 22 | 23 |
24 | 25 | 26 | 27 | 28 | 29 | 30 |
Tags
- 가상환경
- 데이터 엔지니어링
- http
- 파이썬
- TIL
- linux
- HADOOP
- 운영체제
- 데이터엔지니어링
- S3
- 자료구조
- Go
- 컴퓨터네트워크
- 정리
- 데이터베이스
- redshift
- PYTHON
- Django
- 종류
- Docker
- 데이터 파이프라인
- 데이터 웨어하우스
- 컴퓨터 네트워크
- dockerfile
- TCP
- airflow.cfg
- airflow
- 데브코스
- sql
- AWS
Archives
- Today
- Total
홍카나의 공부방
[Go] 정수 타입 변환 - 왜 두 정수의 값이 다른가요? 본문
정수 간의 타입 변환시 유의할 점이 있다. 큰 범위를 갖는 타입에서 작은 범위를 갖는 타입으로 변환하면 값이 달라질 수 있다는 것이다. 아래 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판>
반응형
'Programming Language > Go' 카테고리의 다른 글
[Go] 다운받은 외부 패키지들은 어디에 (1) | 2024.09.09 |
---|---|
[Go, C] 구조체 메모리 정렬과 패딩 (0) | 2024.09.06 |