猿问

如何计算golang溢出?

我是 Golang 的新手


package main


import "fmt"


func main() {

    var u uint8 = 255

    var m uint16 = 255

    fmt.Println(u, u-1, u*(u-1))

    fmt.Println(m, m+1, m*m)

}

输出


./g2

255 254 2

255 256 65025

我知道我在第一种情况下溢出了。但是为什么我得到的结果是2呢?


暮色呼如
浏览 104回答 1
1回答

犯罪嫌疑人X

你已经暗示过溢出,事实上这正是这里发生的事情。您已经知道 和u是什么u-1(分别是 255 和 254),所以让我们将它们相乘。这给了我们 64770,或二进制:64770&nbsp; &nbsp; &nbsp; &nbsp;= 1111 1101 0000 0010这个结果是 16 位宽,但我们将它存储在uint8只有 8 位宽的 a 中。因此它被截断为 8 个最低有效位。从数学上讲,这相当于执行64770 mod 2^8或64770 mod 256。在编程上,它等同于执行64770 & (1 << 7)or 64770 & 256:64770&nbsp; &nbsp; &nbsp; &nbsp;= 1111 1101 0000 0010256&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;=&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;1111 111164770 & 256 = 0000 0000 0000 0010 = 2无论您选择如何想象这个操作,结果都是 2。
随时随地看视频慕课网APP

相关分类

Go
我要回答