前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >2022-10-08:以下go语言代码输出什么?A、0 0;B、0 4;C:4 0;D:4 4。package maincons

2022-10-08:以下go语言代码输出什么?A、0 0;B、0 4;C:4 0;D:4 4。package maincons

作者头像
福大大架构师每日一题
发布2022-11-06 10:24:24
2820
发布2022-11-06 10:24:24
举报

2022-10-08:以下go语言代码输出什么?A、0 0;B、0 4;C:4 0;D:4 4。

代码语言:javascript
复制
package main

const s = "Go101.org"
// len(s) == 9
// 1 << 9 == 512
// 512 / 128 == 4

var a byte = 1 << len(s) / 128
var b byte = 1 << len(s[:]) / 128

func main() {
  println(a, b)
}

答案选C。这道题有人选D,也有人选A,但答案总是出乎意料。

1.对于移位操作,x<<y,数据类型是根据x确定。x是byte类型,那么整个表达式也是byte类型,跟y无关。所以var b byte = 1 << len(s[:]) / 128,左移9位,已经溢出了,结果是0。

2.var a byte = 1 << len(s) / 128中,1 << len(s) / 128在编译期间就计算好了。这个可以根据返汇编一探究竟。输入命令go tool compile -S main2.go,如下可见,a在data段,b在bss段,a的值已经在文件中确定了。

总结:这道题非常考细节,考的是移位操作和编译优化两个细节。

代码语言:javascript
复制
"".a SNOPTRDATA size=1
        0x0000 04                                                     0x0000 01 00 00 00 00 00 00 00                          ........
  .
"".b SNOPTRBSS size=1
gclocals·33cdeccccebe80329f1fdbee7f5874cb SRODATA dupok size=8        0x0000 01 00 00 00 00 00 00 00

答案选C。这道题有人选D,也有人选A,但答案总是出乎意料。

1.对于移位操作,x<<y,数据类型是根据x确定。x是byte类型,那么整个表达式也是byte类型,跟y无关。所以var b byte = 1 << len(s[:]) / 128,左移9位,已经溢出了,结果是0。

2.var a byte = 1 << len(s) / 128中,1 << len(s) / 128在编译期间就计算好了。这个可以根据返汇编一探究竟。输入命令go tool compile -S main2.go,如下可见,a在data段,b在bss段,a的值已经在文件中确定了。

总结:这道题非常考细节,考的是移位操作和编译优化两个细节。

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2022-10-08,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 福大大架构师每日一题 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档