"일꾼이 일을 잘하려면 먼저 도구를 갈고 닦아야 한다." - 공자, 『논어』.
첫 장 > 프로그램 작성 > Go에서 `uint8`을 `int8`로 변환하면 예기치 않은 동작이 발생하는 이유는 무엇입니까?

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

2024년 12월 23일에 게시됨
검색:119

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

uint8에서 int8로의 변환을 둘러싼 혼란

Go에서 uint8을 int8로 변환하면 다음에 강조된 것처럼 예상치 못한 동작이 발생할 수 있습니다. 예:

package main

import (
    "fmt"
)

func main() {
    a := int8(0xfc) // Compile error: constant 252 overflows int8
}

상수 0xfc가 int8 범위(-128 ~ 127)를 초과하기 때문에 컴파일 시간 오류로 인해 코드가 실패합니다. 그러나 다음 코드는 오류 없이 컴파일됩니다.

package main

import (
    "fmt"
)

func main() {
    a := 0xfc
    b := int8(a) // Ok
}

차이점은 작업 순서에 있습니다. 첫 번째 예에서 상수는 a에 할당되기 전에 int8로 변환됩니다. 두 번째 예에서는 a에 먼저 값 0xfc가 할당된 다음 int8로 변환됩니다.

Go 언어 사양에 따르면 상수 표현식은 상수 유형으로 표현할 수 있어야 합니다. 이 경우 0xfc는 int8로 표현할 수 없어 컴파일 오류가 발생합니다.

그러나 할당 후 변환을 수행하면 a(더 이상 상수가 아님)의 값이 다음 범위 내에 들어갑니다. int8, 변환이 성공하도록 허용합니다.

실제 사용 사례의 경우 다음 예를 고려하세요.

type Char byte

var c Char = '世' // Error: '世' has value 0x4e16, too large.

이 코드는 상수 'world'(0x4e16)의 값이 바이트( 0~255). 이 문제를 해결하려면 다음 기술을 사용할 수 있습니다.

var c Char = Char('世') // Ok

이 경우 '世'가 먼저 할당됩니다. 바이트 유형으로 변환한 다음 Char로 변환합니다. 이렇게 하면 값이 Char 유형의 범위 내에 있는지 확인됩니다. 결과 값의 부호를 고려하여 바이트를 int32로 변환할 때 유사한 기술을 적용할 수 있습니다.

최신 튜토리얼 더>

부인 성명: 제공된 모든 리소스는 부분적으로 인터넷에서 가져온 것입니다. 귀하의 저작권이나 기타 권리 및 이익이 침해된 경우 자세한 이유를 설명하고 저작권 또는 권리 및 이익에 대한 증거를 제공한 후 이메일([email protected])로 보내주십시오. 최대한 빨리 처리해 드리겠습니다.

Copyright© 2022 湘ICP备2022001581号-3