2017-12-29 40 views
2

ビット単位の操作とここでの初心者の移動:D移動先のセンサーからいくつかのデータを読み込み、2バイトとして取得します - 0xFFFEとしましょう。私たちはちょうどuint16(0xFFFE)を実行することができますが、センサーが-32768から32767までの範囲の実際の値を返すので、整数に変換する必要があるので、uint16にキャストするのは簡単です。今度はと思ったかもしれません。これがいいのですか?私がすればint16(0xFFFE)それは私が欲しいものを理解するでしょうか? "ですが、動作しているようキャストするための適切な方法

x := 0xFFFE 

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

、しかしA)私は完全にその理由を確認してください、そしてBはないです)それは私が想像したものに少し醜い:私は、次の解決策を(私はウェブからいくつかのpythonコードを翻訳)使用して終了しましたuint16〜int16をキャストするための簡単な解決策でなければなりません。誰もが私に手を差し伸べて、これがなぜこの方法であるのか明確にすることはできますか?それとも他の方法がありますか?

+2

マイナーnitpick:Goは型キャストを持っていません。それはむしろ型変換を持っています。 – kostix

答えて

6

しかし、あなたが作品を望むものを、 "Goがいいです":

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

が出力(Go Playground上でそれを試してみてください):

65534 
-2 

int16(0xFFFE)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

パーフェクト!結論として、Goは確かに素晴らしいです。ちょっとだけ知識が必要です:) – Devlige