我是 Golang 的新手package mainimport "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)}输出./g2255 254 2255 256 65025我知道我在第一种情况下溢出了。但是为什么我得到的结果是2呢?
1 回答
犯罪嫌疑人X
TA贡献2080条经验 获得超4个赞
你已经暗示过溢出,事实上这正是这里发生的事情。您已经知道 和u是什么u-1(分别是 255 和 254),所以让我们将它们相乘。这给了我们 64770,或二进制:
64770 = 1111 1101 0000 0010
这个结果是 16 位宽,但我们将它存储在uint8只有 8 位宽的 a 中。因此它被截断为 8 个最低有效位。从数学上讲,这相当于执行64770 mod 2^8或64770 mod 256。在编程上,它等同于执行64770 & (1 << 7)or 64770 & 256:
64770 = 1111 1101 0000 0010
256 = 1111 1111
64770 & 256 = 0000 0000 0000 0010 = 2
无论您选择如何想象这个操作,结果都是 2。
- 1 回答
- 0 关注
- 103 浏览
添加回答
举报
0/150
提交
取消