Go의 상수 오버플로 이해
Go 프로그래밍 언어는 상수 개념을 포함한 포괄적인 유형 시스템을 제공합니다. 그러나 상수로 작업할 때는 잠재적인 오버플로를 인식하는 것이 중요합니다. 이러한 사례 중 하나는 유형이 지정되지 않은 상수를 사용하여 유형이 지정된 변수에 대해 비트 연산을 수행하는 것과 관련됩니다.
문제 설명
다음 코드 조각을 고려하세요.
<code class="go">userid := 12345 did := (userid & ^(0xFFFF << 48))</code>
이 코드를 컴파일하는 동안 다음 오류 메시지가 나타날 수 있습니다.
./xxxx.go:511: constant -18446462598732840961 overflows int
설명
^(0xFFFF << 48) 표현식은 다음을 나타냅니다. 유형이 지정되지 않은 상수. Go에서는 유형이 지정되지 않은 상수가 임의로 큰 값을 가질 수 있습니다. 이 경우 부정 연산의 결과는 -0xffff000000000001로, 너무 커서 int에 담을 수 없습니다.
비트 연산의 결과를 int 유형의 변수 did에 할당하면, 컴파일러는 유형이 지정되지 않은 상수를 int로 변환하려고 시도하여 오버플로 오류가 발생합니다.
해결책
이 문제를 해결하려면 다음과 같은 대체 상수를 사용할 수 있습니다. int 유형 내에서. 예를 들어, 문제가 있는 표현식을 1<<48 - 1로 바꿀 수 있습니다. 이 계산은 64비트 시스템의 int64와 호환되는 상수 0x0000ffffffffffff를 생성합니다.
추가 팁
이식성을 목표로 한다면 코드에 int 대신 int64를 사용하는 것이 좋습니다. 이렇게 하면 int가 32비트인 시스템에서도 언급된 코드가 올바르게 작동할 수 있습니다.
위 내용은 유형이 지정되지 않은 상수와 함께 비트 연산을 사용할 때 내 Go 코드에서 상수 오버플로 오류가 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!