奇思妙想 · 2024年 4月 26日 0

隐式/显式类型转换

73 次浏览

编译器为了简化不同类型变量互操作,引入隐式转换。

隐式转换

  • C/ObjC/C++/C# 等都支持隐式转换,"小"类型和"大"类型操作,"小"类型自动转换成"大"类型。但隐式转换很可能带来风险。
    • 浮点数类型可以隐式转换成unsigned long long, 注意可能损失精度。
  • Swift为了消除隐式转换的风险,规定不同类型变量运算,必须强制转换成相同类型
    - 比如In8和Int32相加,Int8必须强制转换成Int32才能相加:a是Int8, b是Int32, b = Int32(a) + b
    - 字面量运算不受如上限制,编译器会自动推导,例如var c = 1 + 0.1
  • 仓颉 同样不支持隐式类型转换,对于二元运算符(除了幂运算符),两个操作数类型必须一致。包括但不限于算术运算符、关系运算符等。

不同的显式类型转换

  • 仓颉
    • Type(val)
      例如Int64(3.5)
  • Swift
    • Type(val)
  • C/ObjC/C++/C#
    • (Type)val

显示转换一定会成功?

  • C# 显示转换只是程序员的一种想法,运行时遇到问题一样会抛出异常。

数值和布尔类型转换

  • C/ObjC 布尔类型_Bool本质是整型,二者可以互相转换。
  • C# 不允许数值和布尔互相转换。