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