2017-12-29 4 views
2

비트 조작 및 Go Newbie here : D 이동 (Go)을 사용하여 센서에서 일부 데이터를 읽고 2 바이트로 얻습니다. 예를 들어 0xFFFE이라고합시다. Go에서 우리는 단지 uint16(0xFFFE)을 수행 할 수 있기 때문에 uint16에 캐스트하기가 쉽지만 센서가 -32768에서 32767까지 범위의 사실 값을 반환하기 때문에 정수로 변환해야합니다. 이제 "Go go 이게 좋을까요? 내가 할 경우 int16(0xFFFE) 그것은 내가 원하는 것을 이해할 것입니까? ", 아니요. 나는 다음과 같은 솔루션을 사용하여 종료 (I는 웹에서 일부 파이썬 코드 번역) : 작동하는 것 같다이동에서 uint16에서 int16으로 캐스팅하기위한 적절한 방법

x := 0xFFFE 

if (x & (1 << 15)) != 0 { 
    x = x - (1<<16) 
} 

을하지만 A) 나는 내가 상상 한 것과 추한 약간 모양) 완전히 이유를 확인하고, B 아니다 uint16을 int16으로 캐스팅하는 간단한 솔루션이어야합니다. 누구든지 나에게 손을 뻗어 이것이 왜 이렇게 할 수있는 유일한 이유인지 명확히 할 수 있을까? 아니면 다른 가능한 방법이 있습니까?

+2

사소한 nitpick : 이동 타입 캐스팅을하지 않는다; 오히려 유형 변환이 있습니다. – kostix

답변

6

하지만 당신은, "가서 좋은"일을 원하는 :

ui := uint16(0xFFFE) 
fmt.Println(ui) 
i := int16(ui) 
fmt.Println(i) 

출력합니다 (Go Playground에 그것을 시도) : 0xfffe가 지정되지 않은 정수이기 때문에

65534 
-2 
이 가

int16(0xFFFE)이 작동하지 않습니다 상수는 int16 유형의 값으로 표시 할 수 없기 때문에 컴파일러가 불만을 토로합니다. 그러나 확실하게 임의의 uint16 값을 int16으로 변환 할 수 있습니다.

이 가능 중복을 참조하십시오

Golang: on-purpose int overflow

Does go compiler's evaluation differ for constant expression and other expression

+1

'fmt.Println (int16 (uint16 (0xFFFE)))'과 약간 다른 형식으로 시도해 보았습니다. 오버플로 오류가 발생합니다. 그렇다면 당신의 예에서 왜 작동합니까? – Devlige

+2

@Devlige 형식이 정확한 값을 나타낼 수있는 경우에만 상수 값을 변환 할 수 있기 때문입니다. 내 예제에서는 상수가 아닌 변수를 변환하지 않고 오버플로가 허용됩니다 (다른 언어와 마찬가지로). 자세한 내용은 다음을 확인하십시오. [상수 표현 및 기타 표현식에 대해 컴파일러의 평가가 다른가요?] (https://stackoverflow.com/questions/39444852/does-go-compilers-evaluation-differ-for-constant- 표현 및 기타 표현/39445372 # 39445372) – icza

+0

Perfect! 결론적으로 Go는 참으로 좋습니다. 조금 더 많은 지식이 필요합니다. 감사합니다. – Devlige

관련 문제