>백엔드 개발 >Golang >내 Go 코드에서 상수를 사용할 때 오버플로 오류가 발생하는 이유는 무엇입니까?

내 Go 코드에서 상수를 사용할 때 오버플로 오류가 발생하는 이유는 무엇입니까?

Barbara Streisand
Barbara Streisand원래의
2024-11-02 00:42:02743검색

Why Does My Go Code Experience an Overflow Error When Using Constants?

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 중국어 웹사이트의 기타 관련 기사를 참조하세요!

성명:
본 글의 내용은 네티즌들의 자발적인 기여로 작성되었으며, 저작권은 원저작자에게 있습니다. 본 사이트는 이에 상응하는 법적 책임을 지지 않습니다. 표절이나 침해가 의심되는 콘텐츠를 발견한 경우 admin@php.cn으로 문의하세요.