Go에서 계단식 상수 오버플로
Go에서 상수로 작업할 때 잠재적인 오버플로를 피하기 위해 유형 변환을 이해하는 것이 중요합니다. 다음 코드 조각을 고려하세요.
<code class="go">const ( userid = 12345 did = (userid &^ (0xFFFF << 48)) )</code>
이 코드를 컴파일하면 다음 오류가 발생합니다.
constant -18446462598732840961 overflows int
이 문제를 해결하려면 Go가 수행하는 기본 유형 변환을 자세히 조사해야 합니다.
유형이 지정되지 않은 상수 및 유형 변환 이해
위 코드에서 상수 0xFFFF << 48은 유형이 지정되지 않은 상수입니다. 즉, 할당된 특정 유형이 없음을 의미합니다. 유형이 지정되지 않은 상수와 유형이 지정된 값을 결합할 때 유형이 지정되지 않은 상수는 다른 피연산자의 유형을 취합니다.
이 경우 유형이 지정된 상수 userid(int) 간에 AND 연산(&)을 수행합니다. ) 및 유형이 지정되지 않은 상수 0xFFFF << 48. 따라서 결과 표현식(userid &^ (0xFFFF << 48))은 int가 됩니다.
정수 상수 오버플로
문제는 다음과 같은 경우에 발생합니다. 유형이 지정되지 않은 상수 0xFFFF << 48, 결과적으로 -0xffff000000000001이 됩니다. 이 값은 int 유형(서명되고 -2^31 ~ 2^31-1 범위)에 비해 너무 크기 때문에 컴파일 오류가 발생합니다.
이식성을 위해 Int64 사용
이 문제를 방지하려면 범위가 더 크고 더 큰 상수 값을 수용할 수 있는 int64와 같은 더 큰 정수 유형을 사용할 수 있습니다.
<code class="go">const ( userid int64 = 12345 did = (userid &^ (0xFFFF << 48)) )</code>
이 변경을 통해 오버플로가 발생하지 않고 사용 가능한 정수 유형의 제약 조건 내에서 상수를 표현하고 조작할 수 있습니다.
위 내용은 내 Go 코드에서 상수를 사용할 때 오버플로 오류가 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!