gpt4 book ai didi

go - 对于int8 var,如何理解 "-128/-1"和 "-128 * -1"结果是-128?

转载 作者:行者123 更新时间:2023-12-01 22:30:41 25 4
gpt4 key购买 nike

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

var n int8 = -128

n /= -1
fmt.Println(n)

n *= -1
fmt.Println(n)
以上 code都会输出 -128 .我也试过 -64 * -2这也导致了 -128 .
是值 -128特别这意味着这里的int溢出?

最佳答案

它不是溢出时使用的特殊值,它只是带符号的 8 位整数的最小值(有效范围为 [-128, 128) ,意味着包括 -128,但不包括 128)。
在简单的情况下,例如增加最大值(例如: int8(127) + 1 ),您会溢出整数并以最小值结束。
在 Go 中,这是完全可以接受的,正如 spec 所提到的。

For signed integers, the operations +, -, *, /, and << may legallyoverflow and the resulting value exists and is deterministicallydefined by the signed integer representation, the operation, and itsoperands. Overflow does not cause a run-time panic. A compiler may notoptimize code under the assumption that overflow does not occur. Forinstance, it may not assume that x < x + 1 is always true.


但是您的具体情况有所不同,这是由于 取最大负值的补码返回相同的值 .
最简单的例子是这个:
    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 .
在除法的情况下,结果在某些语言中是未定义的。
Go spec 没有留下这种歧义,说明了这种特殊情况:

... if the dividend x is the mostnegative value for the int type of x, the quotient q = x / -1 is equalto x (and r = 0) due to two's-complement integer overflow


您可以在 Wikipedia 上找到有关二进制补码算法的更多信息,其中有一个专门讨论 the most negative number 的部分。 .

关于go - 对于int8 var,如何理解 "-128/-1"和 "-128 * -1"结果是-128?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/63447359/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com