>  기사  >  백엔드 개발  >  Go에서 `uint8`을 `int8`로 변환하면 예기치 않은 동작이 발생하는 이유는 무엇입니까?

Go에서 `uint8`을 `int8`로 변환하면 예기치 않은 동작이 발생하는 이유는 무엇입니까?

Susan Sarandon
Susan Sarandon원래의
2024-10-26 19:33:03251검색

Why Does Converting a `uint8` to an `int8` in Go Lead to Unexpected Behavior?

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

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