登录
首页 >  Golang >  Go问答

在Go语言中为什么-2与-1相乘结果仍然为-2?

来源:stackoverflow

时间:2024-03-06 19:21:25 285浏览 收藏

最近发现不少小伙伴都对Golang很感兴趣,所以今天继续给大家介绍Golang相关的知识,本文《在Go语言中为什么-2与-1相乘结果仍然为-2?》主要内容涉及到等等知识点,希望能帮到你!当然如果阅读本文时存在不同想法,可以在评论中表达,但是请勿使用过激的措辞~

问题内容

为什么-2&-1 结果是-2? 我假设 0010 和 0001 将得到 0000。事实上,当数字为正数时,结果就是 0000。

fmt.Printf("%b, %b, %v\n", -2, -1, -2&-1)
// shows: -10, -1, -2

https://play.golang.org/p/2g3vdwxay2j


正确答案


这实际上是一个关于数字在计算机中如何表示的问题,而不是关于 go 的问题。您将从其他语言/环境(例如 c 或 python)获得相同的结果。

为了简单起见,我们假设 8 位。 -2 是二进制的 11111110 (使用 two's complement,这是现代机器中表示负整数的标准方式)。 -1 是二进制的 11111111。其中 and11111110,即 -2。

实际上,go 整数可能是 32 或 64 位,但这不会改变答案。只需在上述表示的左侧添加一堆 1 即可。结果仍然是 1111....1110,即 -2。

我认为你被 https://golang.org/pkg/fmt/#hdr-Printing 中的细则欺骗了:

格式字符串中的 %b 代表“基数 2”,而不是“二进制”。您得到的是以 2 为基数的有符号值的(符号)表示:-10,而不是内存中实际位的表示。

查看二进制布局的一种方法是转换为值的无符号变体:

var i int32 = -2
    
    fmt.Printf("base2 = %b\n", i)
    fmt.Println("casting to unsigned :")
    fmt.Printf("base2 = %b\n", uint32(i))

// Output:
//   base2 = -10
//   casting to unsigned :
//   base2 = 11111111111111111111111111111110

https://play.golang.org/p/nfxS7Tv5HuL

注意:这同样适用于带符号 int 的 %x :您得到 -2 (以 16 为基数表示的值),而不是 fffffffe

今天关于《在Go语言中为什么-2与-1相乘结果仍然为-2?》的内容介绍就到此结束,如果有什么疑问或者建议,可以在golang学习网公众号下多多回复交流;文中若有不正之处,也希望回复留言以告知!

声明:本文转载于:stackoverflow 如有侵犯,请联系study_golang@163.com删除
相关阅读
更多>
最新阅读
更多>
课程推荐
更多>