数值类型运算后值溢出会发生什么
1.无符号整型溢出时,值为0
func main()
{
var x1 uint64 = math.MaxUint64
var y1 uint64 = 1
//无符号整型溢出
addUint(x1, y1)
}
func addUint(x, y uint64) {
sum := x + y
fmt.Println("addUint:", sum)
fmt.Printf("addUint %b \n", sum)
}
2.有符号整型溢出,值出现反转
fun main()
{
//有符号整数运算时出现溢出
var x2 int64 = math.MaxInt64
var y2 int64 = 1
addInt(x2, y2)
}
func addInt(x, y int64) {
sum := x + y
fmt.Println("addInt64: ", sum, "max int64", math.MaxInt64)
}
运行结果:
C:\Users\admin\AppData\Local\Temp\GoLand\___go_build_main_go.exe
addInt64: -9223372036854775808 max int64 9223372036854775807
3.常量值不允许溢出
4.数值类型转换时需要考虑溢出问题
下面展示一些 内联代码片
。
func main()
{
var x4 int32 = math.MaxInt32
y4 := int16(x4)
fmt.Println("y4:", y4)
if (x4 < math.MinInt16) || (x4 > math.MaxInt16) {
// 错误处理
}
}
5.整型转换时出现符号丢失
func main()
{
var x5 int32 = math.MinInt32
y5 := uint32(x5)
fmt.Println("x5:", x5, "y5:", y5)
if x5 < 0 {
// 错误处理
}
}
运行结果:
C:\Users\admin\AppData\Local\Temp\GoLand\___go_build_main_go.exe
addInt64: -9223372036854775808 max int64 9223372036854775807
6.浮点型溢出后为最大值
func main()
{
x := math.MaxFloat64
y := float64(1000)
z := x + y
fmt.Println("z:", z, "math.MaxFloat64:", x, x == z)
}
运行结果
C:\Users\admin\AppData\Local\Temp\GoLand\___go_build_main_go.exe
z: 1.7976931348623157e+308 math.MaxFloat64: 1.7976931348623157e+308 true
7.浮点数的其它情况
func main()
{
//x1 := float64(0.4)
//y1 := float64(0.5)
//fmt.Println("x1+y1=", x1+y1) //x1+y1= 0.9
//x2 := float64(0.3)
//y2 := float64(0.6)
//fmt.Println("x2+y2=", x2+y2) //x+y= 0.899999999999999
x3 := float64(0.1)
y3 := float64(0.2)
fmt.Println("x3+y3=", x3+y3, "0.1+0.2=", 0.1+0.2) //x3+y3= 0.30000000000000004 0.1+0.2= 0.3
//如果使用常量,这种情况就不会发生精度损失。
//const c1 = 0.3
//const c2 = 0.6
//fmt.Println("c1+c2=", c1+c2, "c1 type:", reflect.TypeOf(c1))
//浮点数不满足结合率
var x = 0.3
var y = 0.6
var z float64 = 0.1
fmt.Println("(x+y)+z:", (x+y)+z, "x+(y+z):", x+(y+z))
//四舍但不一定五入
fmt.Printf("%.2f\n", 9.824)
fmt.Printf("%.2f\n", 9.8250)
fmt.Printf("%.2f\n", 9.8251)
fmt.Printf("%f\n", float32(1)/float32(3)) //0.333333
fmt.Printf("%f\n", float32(1/3)) //0.000000
var f1 float32 = -1.123456789
f2 := -1.123456789
fmt.Println("f1:", f1, "f2:", f2) //f1: -1.1234568 f2: -1.123456789
}