본문 바로가기
프로그래밍/Golang

Golang 정수 타입과 아키텍처 의존성

by slowin 2024. 8. 6.

개요

Go 언어에서 정수 타입은 크게 두 가지 범주로 나눌 수 있어요.

  1. 아키텍처 독립적 타입 (Architecture-independent types)
  2. 아키텍처 의존적 타입 (Architecture-dependent types)

해당 부분에 대해서 알아보겠습니다.

 

1. 아키텍처 독립적 타입

이 타입들은 CPU 아키텍처와 관계없이 항상 동일한 크기를 가집니다:

  • int8, uint8 (별칭: byte): 항상 1바이트
  • int16, uint16: 항상 2바이트
  • int32 (별칭: rune), uint32: 항상 4바이트
  • int64, uint64: 항상 8바이트

2. 아키텍처 의존적 타입

이 타입들은 CPU 아키텍처에 따라 크기가 달라집니다:

  • int, uint:
    • 32비트 시스템에서 4바이트
    • 64비트 시스템에서 8바이트
  • uintptr: 포인터를 저장할 수 있는 부호 없는 정수 타입으로, int/uint와 동일한 크기

'int' 타입의 특징

  1. 크기 변동
    • 32비트 시스템: int는 32비트 (4바이트)
    • 64비트 시스템: int는 64비트 (8바이트)
  2. 사용 시 주의사항
    • 크로스 플랫폼 개발 시 int의 크기 변동을 고려해야 함
    • 정확한 크기가 필요한 경우 int32나 int64 같은 명시적 타입 사용 권장
  3. 예시
import "unsafe"

func main() {
    var i int
    fmt.Printf("Size of int: %d bytes\n", unsafe.Sizeof(i))
    // 32비트 시스템에서: "Size of int: 4 bytes"
    // 64비트 시스템에서: "Size of int: 8 bytes"
}

 

정리

  • rune (int32), int8, int16, int64 등은 아키텍처와 무관하게 고정된 크기
  • int와 uint는 CPU 아키텍처에 따라 크기가 변동됨
  • 크로스 플랫폼 호환성이 중요한 경우, 명시적 크기의 타입 (int32, int64 등) 사용 권장
  • int 타입은 일반적인 용도로 효율적이지만, 정확한 크기가 필요한 경우 주의 필요