如何在swift中屏蔽或转换Int32到Int16

时间:2017-10-24 10:17:21

标签: swift int bitmask

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

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编译器是自己做的。

1 个答案:

答案 0 :(得分:5)

这实际上很简单,你只需要明确说明你想做什么:

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

(该方法在Swift 3中称为truncatingBitPattern:

truncatingIfNeeded会将低16位重新解释为Int16

请注意& 0xffff在这种情况下不起作用。默认初始化程序尝试转换数值,而不是位值,不幸的是45058,或0xB002将通过& 0xffff保持不变,并且不会适合Int16。这虽然适用于无符号整数。