【问题标题】:Does Go fix or share C's hazardous implicit -> unsigned conversion?Go 是否修复或共享 C 的危险隐式 -> 无符号转换?
【发布时间】:2017-04-10 18:10:10
【问题描述】:

在“21 世纪 C”中,Ben Klemens 描述了 C 如何自动将有符号数转换为无符号数,例如比较表达式。 Go 是否有同样的危险行为,或者 Go 有不同的处理方式?

【问题讨论】:

    标签: c go types unsigned signed


    【解决方案1】:

    Go 中没有隐式转换。为了对两个不同类型的值进行比较或算术运算,您必须进行手动和显式类型转换。

    a := 3          // numerical constant 3 defaults to int
    b := uint(2)
    c := a < b      // compiler error
    d := a < int(b) // OK
    

    【讨论】:

      【解决方案2】:

      Go 仅使用 explicit type conversions 进行所有操作,包括比较。

      var a uint64
      var b int64
      
      a = 1
      b = 1
      if a == b {
          fmt.Println("Equal")
      }
      

      这个sn-p会报错:

      tmp/sandbox428200464/main.go:13:无效操作:a == b(uint64 和 int64 类型不匹配)

      要进行比较,您必须将变量显式转换为相同的类型:

      if int64(a) == b {...}
      

      所以,肯定是的,如果有人能这么说,那是固定的。

      Playgound 用于 sn-p。

      【讨论】:

        猜你喜欢
        • 2016-06-27
        • 2019-09-26
        • 2013-07-23
        • 2012-03-22
        • 1970-01-01
        • 2010-11-30
        • 2023-04-03
        • 1970-01-01
        • 2021-11-16
        相关资源
        最近更新 更多