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