代码之家  ›  专栏  ›  技术社区  ›  pynexj

对于int8 var,如何理解“-128/-1”和“-128*-1”的结果是-128?

go
  •  0
  • pynexj  · 技术社区  · 5 年前

    几周前刚开始学围棋,行为让我很困惑。

    var n int8 = -128
    
    n /= -1
    fmt.Println(n)
    
    n *= -1
    fmt.Println(n)
    

    code 两者都会输出吗 -128 . 我也试过了 -64 * -2 这也导致了 -128

    价值是多少 -128 特别的意思是int 在这里?

    0 回复  |  直到 5 年前
        1
  •  5
  •   Marc    5 年前

    它不是用于溢出的特殊值,它只是有符号8位整数的最小值(有效范围为 [-128, 128) ,表示包含-128,但不包含128)。

    int8(127) + 1 ),则会使整数溢出并以最小值结束。

    在围棋中,这是完全可以接受的,正如 spec

    对于有符号整数,+、-、*、/、和<<运算可以合法地进行 操作数。溢出不会导致运行时恐慌。编译器不能

    但你的具体情况不同,是因为 .

    最简单的例子是:

        var n int8 = -128
        fmt.Println(-n)
        // output -128
    

    这是因为翻转所有位并加1返回完全相同的结果:

      // Start with -128
      n = 1000 0000
      // Flip bits:
      n = 0111 1111
      // Add 1:
      n = 1000 0000
    

    -(-128) == -128 .

    这同样适用于乘法和除法: -1 * (-128) == -128 . 与其离开这个模棱两可的地方 规格 说明这种特殊情况:

    负值对于int类型的x,商q=x/-1等于 到x(且r=0),因为2的补码整数溢出

    the most negative number