代码之家  ›  专栏  ›  技术社区  ›  Krishnadas PC

uint8上的算术,int8

  •  0
  • Krishnadas PC  · 技术社区  · 7 年前

    上的算术运算得到负和零的原因是什么? 单元8 国际电信公司8 给定示例的数据类型

    package main
    
    import (
        "fmt"
    )
    
    func main() {
    
         var u uint8 = 255
         fmt.Println(u, u+1, u*u) // "255 0 1"
         var i int8 = 127
         fmt.Println(i, i+1, i*i) // "127 -128 1"
    }
    

    https://play.golang.org/p/_a2KHP29t5p

    2 回复  |  直到 7 年前
        1
  •  2
  •   hyde Juniar    7 年前

    如另一个答案所示,与其他一些编程语言不同,go以一种定义良好的方式处理所有整数溢出,类似于在程序集级别的大多数当前CPU上所发生的情况。


    127=0111 1111二进制

    +1=1000 0000二进制

    被解释为有符号二的补码8位整数的是-128。


    255=1111111二进制

    +1=100000000二进制(注9位)

    如果我们有9个位,那就是256,但是我们没有,我们只有8个位,所以它变成0000个二进制,也就是0。


    同样,对于乘法:

    127*127=16129=0011 1111 0000 0001箱

    255*255=65025=1111 1110 0000 0001箱

    两者都有较低的8位,因为0000 0001 bin=1


    注意:大多数情况下,如果您依赖整数溢出,那么您应该后退一步,仔细考虑一下这是否是您所做工作的最佳方式。这是一种非常低级的行为,涉及精确的按位行为,并且应该始终伴随足够的注释来解释什么和为什么。

        2
  •  3
  •   leaf bebop    7 年前

    go不会在运行时因整数溢出而死机。按照 doc :

    对于无符号整数值,操作+、-、*和<<是 计算模2n,其中n是无符号整数的位宽度 类型。不严格地说,这些无符号整数操作放弃了高 位溢出,程序可能依赖于“环绕”。

    对于有符号整数,操作+、-、*、/和<<可以合法 溢出和结果值存在,并且是确定的 由有符号整数表示、操作及其 操作数。溢出不会引发异常。编译程序 不能在假定溢出不 发生。例如,它可能不认为x<x+1总是正确的。

    推荐文章