jinzh notes
jinzh notes

Go问题记录

Go问题记录
内容纲要

前言

记录平常写程序或者看题中发现的小问题

问题

func main() {
    var a int8 = -1
    var b int8 = -128 / a
    fmt.Println(b)
}

输出结果


-128

int8 能表示的数字的范围是 [-2^7, 2^7-1],即 [-128, 127]。-128 是无类型常量,转换为 int8,再除以变量 -1,结果为 128,常量除以变量,结果是一个变量。变量转换时允许溢出,符号位变为1,转为补码后恰好等于 -128。

对于有符号整型,最高位是是符号位,计算机用补码表示负数。补码 = 原码取反加一。

-1 :  11111111
00000001(原码)    11111110(取反)    11111111(加一)
-128:    
10000000(原码)    01111111(取反)    10000000(加一)

-1 + 1 = 0
11111111 + 00000001 = 00000000(最高位溢出省略)
-128 + 127 = -1
10000000 + 01111111 = 11111111

func main() {
    const a int8 = -1
    var b int8 = -128 / a
    fmt.Println(b)
}

输出:


编译失败:constant 128 overflows int8

-128 和 a 都是常量,在编译时求值,-128 / a = 128,两个常量相除,结果也是一个常量,常量类型转换时不允许溢出,因而编译失败。


type T struct{}

func (t T) f(n int) T {
    fmt.Print(n)
    return t
}

func main() {
    var t T
    defer t.f(1).f(2)
    fmt.Print(3)
}

输出:


132

defer 延迟调用时,需要保存函数指针和参数,因此链式调用的情况下,除了最后一个函数/方法外的函数/方法都会在调用时直接执行。也就是说 t.f(1) 直接执行,然后执行 fmt.Print(3),最后函数返回时再执行 .f(2),因此输出是 132。


影翼

文章作者

发表评论

textsms
account_circle
email

jinzh notes

Go问题记录
前言 记录平常写程序或者看题中发现的小问题 问题 一 func main() { var a int8 = -1 var b int8 = -128 / a fmt.Println(b) } 输出结果 -128 int8 能表示的数字的范围是 [-…
扫描二维码继续阅读
2022-02-25