在给定的示例中,对unit8和int8数据类型的算术运算得到负和零的原因是什么?
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"
}发布于 2019-02-09 15:30:09
如另一个答案所示,与其他一些编程语言不同,Go以一种定义良好的方式处理所有整数溢出,类似于当前大多数CPU在程序集级别上发生的情况。
127 = 0111 1111二进制
+1= 1000 000二进制
被解释为有符号2的补码8位整数的是-128。
255 =11111111二进制
+1=10 0000二进制(注9位)
如果我们有9位,那就是256,但是我们没有,我们只有8,所以它变成0000二进制,也就是0。
类似于乘法:
127*127 = 16129 =0011 1111 0000 0001bin
255 * 255 = 65025 =1111 1110 0000 0001bin
两者都有较低的8位,如0000 0001 bin =1。
注意:大多数情况下,如果您依赖于整数溢出,那么您应该后退一步,仔细考虑如果这是您正在做的事情的最佳方式。这是非常低层次的行为,涉及确切的位行为,并应始终与足够的评论解释什么和为什么。
发布于 2019-02-09 11:21:22
在运行时,Go不会对整数溢出感到恐慌。根据文档
对于无符号整数值,运算+、-、*和<<被计算为模2n,其中n是无符号整数类型的位宽。松散地说,这些无符号整数操作在溢出时丢弃高位数,程序可能依赖于“环绕”。 对于有符号整数,操作+、-、*、/和<<可能合法溢出,结果值存在并由有符号整数表示、操作及其操作数确定地定义。溢出不会引发任何异常。在不发生溢出的假设下,编译器可能不会优化代码。例如,它可能不会假设x
https://stackoverflow.com/questions/54605650
复制相似问题