오늘 Go로 비트연산 하다 우연히 발견한 사실


var x int = 8

fmt.Println(1 << x)


이걸 컴파일하려 하면 쉬프트 연산에는 unsigned int를 써야 한다며 에러가 뜬다.


Go에서는 named type간에 암묵적 형변환이 일어나지 않고

int와 uint는 모두 named type이므로

x가 int형인채 형변환 없이 쉬프트 연산에 들어갔을 것이다.

따라서 쉬프트 연산에 uint를 써야한다면 당연히 에러가 뜬다.


그런데 1 << 8은 에러가 안 난다.


그렇다면 추측해볼 수 있는 경우는 3가지.


1. 8이라는 정수 리터럴은 uint 자료형을 갖는다.

-> 말이 안 됨.


2. 리터럴은 unnamed type이다.

-> 그런가?


3. 리터럴은 type이 없다

-> 그런가?


공식 홈페이지의 언어 스펙란을 참고해봐도 리터럴의 자료형에 대한 말은 따로 안 나옴.. 


type literal에 대한 말은 나오는데 이건 literal의 type과는 다른 이야기였다.

type은 type name과 type literal을 갖으며

type INTEGERS []int

여기서 INTEGERS가 type name, []int가 type literal이라는 것


단서를 찾을 수가 없다.. ㅠㅠ