[완료][Go(lang)] 쉬프트 연산 수행이 C와 좀 다릅니다.
글쓴이: mendoza / 작성시간: 월, 2011/05/09 - 10:23오후
C의 경우,
unsigned int i = (1 << 32) -1
은 오버플로우 에러를 발생시킵니다.
그런데 Go언어의 경우,
var i uint32 = (1 << 32) -1
은 에러없이 이진수로 11111...11 최대값이 출력됩니다.
단순히 1 << 32 만 연산하면 오버플로우 에러를 발생시키는데,
(1 << 32) - 1 을 묶어서 연산하면 에러없이 의도한 값이 출력됩니다.
내부적으로 32 bit를 넘으면 넘어선 bit는 잘린다고 알고 있는데,
Go에서는 내부적으로 어떤 처리를 하고 있길래
이후의 뺄셈 연산이 정상적으로 되는 걸까요?
Forums:
오버플로우 에러가 다음과 같은 컴파일타임에러가
오버플로우 에러가 다음과 같은 컴파일타임에러가 아닌지요? constant 4294967296 overflows int
1 << 32는 모두 상수라서 컴파일러가 미리 (최대타입으로) 계산한 다음에 그게 해당타입에 맞지 않으면 컴파일 타임 에러를 내는것입니다.
예를 들어, uint64(1) << 32 는 괜찮을 거예요. 4294967296이 64bit에 담길수 있기 때문에요.
비슷한 경우 대게 C컴파일러도 경고 정도는 내 주죠.
(i << 32) - 1은 그냥 컴파일되어서 연산하면 -1이 되는데 i가 uint32라 그렇게 되는거고요.
bacon님 답변 감사합니다.
bacon님 설명을 듣고 제가 상수 개념을 놓쳤다는 사실을 깨달았습니다.
정확히 짚어주신 설명 덕분에 쉽게 이해가 되었고 크게 배웠습니다.
답변, 다시 한번 감사 드립니다.
댓글 달기