【问题标题】:How can I mask or convert Int32 to Int16 in swift如何快速屏蔽或将 Int32 转换为 Int16
【发布时间】:2017-10-24 10:17:21
【问题描述】:

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

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

【问题讨论】:

  • 如果有符号 16 位整数的最大值为 32767,您打算如何将 45058 转换为有符号 16 位整数?
  • @mag_zbc 这显然应该是截断强制转换,这在 C 或 Java 中会发生。

标签: swift int bitmask


【解决方案1】:

这其实很简单,你只要明确说出你想做什么:

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 在这种情况下不起作用。默认初始化程序尝试转换数值,而不是位值,不幸的是450580xB002 将通过& 0xffff 保持不变,它不适合Int16。不过,这适用于无符号整数。

【讨论】:

  • 你能添加结果值和一两句话解释为什么达到这些值吗?
猜你喜欢
  • 2015-03-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-02-22
  • 1970-01-01
  • 2019-10-11
  • 2011-07-02
  • 2019-04-04
相关资源
最近更新 更多