如何快速屏蔽或将Int32转换为Int16

idr*_*dız 2 int bitmask swift

数据丢失对我来说没有问题。

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
Run Code Online (Sandbox Code Playgroud)

也尝试过这个,但是它也返回错误的值,这不是我想要的。

temp4 = Int16(temp1 & 0x0000ffff)//overflow  
Run Code Online (Sandbox Code Playgroud)

在我的C代码中,没有任何问题,因为c编译器自行完成此操作。

Sul*_*han 7

这实际上非常简单,您只需明确地说出您想做什么:

var temp4: Int16 =  Int16(truncatingIfNeeded: temp1) // -20478
var temp5: Int16 =  Int16(truncatingIfNeeded: temp2) // -20345
var temp6: Int16 =  Int16(truncatingIfNeeded: temp3) // 25191
Run Code Online (Sandbox Code Playgroud)

(该方法truncatingBitPattern:在Swift 3中被调用)

truncatingIfNeeded将低16位重新解释为Int16

请注意,& 0xffff在这种情况下将无法使用。不幸的是,默认的初始化器试图转换数字值,而不是位值45058,否则0xB002将一直保持不变& 0xffff并且不适合Int16。不过,这将适用于无符号整数。