2017-10-24 11 views
0

データの損失は問題ありません。素早くInt32からInt16にマスクするか変換するには

var temp1:Int32 = 45058 
var temp2:Int32 = -20345 
var temp3:Int32 = -40345 

var temp4:Int16 = Int16(temp1)//overflow 
var temp5:Int16 = Int16(temp2)//return wrog value 
var temp6:Int16 = Int16(temp3)//overflow 

もこれを試してみましたが、それはまた間違った値を返して、それは私が欲しいものではありません。

temp4 = Int16(temp1 & 0x0000ffff)//overflow 

私のCコードでは、cコンパイラはこれを自己で行うため、問題はありません。

+2

符号付き16ビット整数の最大値が「32767」であれば、「45058」を符号付き16ビット整数にする方法はありますか? –

+0

@mag_zbcこれは明らかに、CまたはJavaで起こるであろうキャストを切り捨てることになっています。 – Sulthan

答えて

4

これは、あなたがちょうどあなたが何をしたいのか明確に言っている、実際には非常に簡単です:

var temp4: Int16 = Int16(truncatingIfNeeded: temp1) // -20478 
var temp5: Int16 = Int16(truncatingIfNeeded: temp2) // -20345 
var temp6: Int16 = Int16(truncatingIfNeeded: temp3) // 25191 

(メソッドはスウィフト3でtruncatingBitPattern:と呼ばれている)

truncatingIfNeededは、下位16ビットを再解釈しますInt16とします。

この場合、& 0xffffは機能しません。デフォルトの初期化子はに数値を変換しようとしていますが、ビット値ではなく、残念ながら45058または0xB002& 0xffffで変更されず、Int16にはなりません。しかし、それは無署名の整数のために働くでしょう。

+1

結果の値と、それらの値が達成された理由を説明する1つまたは2つの文を追加できますか? – luk2302

関連する問題