>  기사  >  백엔드 개발  >  비트 연산을 사용할 때 Go 상수가 오버플로되는 이유는 무엇입니까?

비트 연산을 사용할 때 Go 상수가 오버플로되는 이유는 무엇입니까?

Patricia Arquette
Patricia Arquette원래의
2024-11-01 08:55:30181검색

Why Does My Go Constant Overflow When Using Bitwise Operations?

Go 상수 오버플로 문제: Int 오버플로 해결

Go 프로그래밍 영역에서 다음과 같은 일반적인 질문이 발생합니다. "userid가 12345일 때 상수가 오버플로되는 이유는 무엇입니까? and did := (userid &^(0xFFFF << 48))?"

이러한 코드를 컴파일할 때 다음과 같은 무서운 오류가 나타납니다. "constant -18446462598732840961 Overflows int." 하지만 이 오해의 소지가 있는 메시지 이면에는 무엇이 있을까요?

문제의 본질

이 문제의 원인은 상수 ^(0xFFFF << 48)의 형식화되지 않은 특성입니다. Go는 유형이 지정되지 않은 상수에 기존 정수의 한계를 초과하는 엄청난 값을 할당합니다.

0xffff << 48은 0xffff000000000000을 생성합니다. 비트 부정 연산자(^)를 사용하여 부호를 바꾸면 -0xffff000000000001이 됩니다.

이제 값 12345로 초기화된 userid 변수는 int 유형을 상속합니다. 비트 AND 연산(&)이 수행되면 컴파일러는 형식이 지정되지 않은 상수를 int 형식으로 다운그레이드해야 한다고 가정합니다. 상수의 크기가 int에 허용되는 최대값을 초과하므로 이 가정은 충돌로 이어집니다.

해결책: 유형 없는 거인 길들이기

이 문제를 해결하려면 유형 캐스팅의 힘을 활용하세요. . 0x0000ffffffffffff 상수를 할당하려는 경우 1<<48 - 1 활용을 고려하세요. 64비트 환경에서 이 표현식을 사용하면 더 큰 정수와의 호환성이 보장됩니다.

진정한 이식성을 위해서는 int를 피하는 것이 좋습니다. int64를 사용하여 32비트 및 64비트 아키텍처를 모두 수용할 수 있도록 코드 범위를 확장합니다.

위 내용은 비트 연산을 사용할 때 Go 상수가 오버플로되는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!

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