uint8에서 int8로의 변환을 둘러싼 혼란
Go에서 uint8을 int8로 변환하면 다음에서 강조된 것처럼 예상치 못한 동작이 발생할 수 있습니다. 예:
<code class="go">package main import ( "fmt" ) func main() { a := int8(0xfc) // Compile error: constant 252 overflows int8 }</code>
상수 0xfc가 int8 범위(-128 ~ 127)를 초과하기 때문에 코드가 컴파일 시간 오류와 함께 실패합니다. 그러나 다음 코드는 오류 없이 컴파일됩니다.
<code class="go">package main import ( "fmt" ) func main() { a := 0xfc b := int8(a) // Ok }</code>
차이점은 작업 순서에 있습니다. 첫 번째 예에서 상수는 a에 할당되기 전에 int8로 변환됩니다. 두 번째 예에서는 a에 먼저 값 0xfc가 할당된 다음 int8로 변환됩니다.
Go 언어 사양에 따르면 상수 표현식은 상수 유형으로 표현 가능해야 합니다. 이 경우 0xfc를 int8로 표현할 수 없어 컴파일 오류가 발생합니다.
그러나 할당 후 변환을 수행하면 a(더 이상 상수가 아닌)의 값이 다음 범위 내에 들어갑니다. int8, 변환이 성공하도록 허용합니다.
실제 사용 사례의 경우 다음 예를 고려하세요.
<code class="go">type Char byte var c Char = '世' // Error: '世' has value 0x4e16, too large.</code>
이 코드는 상수 '世'(0x4e16)의 값 때문에 오류를 발생시킵니다. 바이트 범위(0~255)를 초과했습니다. 이 문제를 해결하려면 다음 기술을 사용할 수 있습니다.
<code class="go">var c Char = Char('世') // Ok</code>
이 경우 '世'를 먼저 바이트 유형에 할당한 다음 Char로 변환합니다. 이렇게 하면 값이 Char 유형의 범위 내에 있는지 확인됩니다. 결과 값의 부호를 고려하여 바이트를 int32로 변환할 때 유사한 기술을 적용할 수 있습니다.
위 내용은 Go에서 `uint8`을 `int8`로 변환하면 예기치 않은 동작이 발생하는 이유는 무엇입니까?의 상세 내용입니다. 자세한 내용은 PHP 중국어 웹사이트의 기타 관련 기사를 참조하세요!