为了账号安全,请及时绑定邮箱和手机立即绑定

为什么 ^1 等于 -2?

为什么 ^1 等于 -2?

Go
白衣染霜花 2022-11-28 17:01:44
fmt.Println(^1)为什么打印这个-2?
查看完整描述

2 回答

?
30秒到达战场

TA贡献1828条经验 获得超6个赞

^运算符是按位补码运算符。规范:算术运算符:

对于整数操作数,一元运算符+-^定义如下:

+x                          is 0 + x

-x    negation              is 0 - x

^x    bitwise complement    is m ^ x  with m = "all bits set to 1" for unsigned x

                                      and  m = -1 for signed x

所以1在二进制中是单个 1 位前面全是零:

0000000000000000000000000000000000000000000000000000000000000001

所以按位补码是一个单独的 0 位,前面是全 1:

1111111111111111111111111111111111111111111111111111111111111110

The^1是一个无类型常量表达式。当它被传递给一个函数时,它必须被转换为一个类型。由于1是无类型整型常量int,因此将使用其默认类型。int在 Go 中使用2 的补码表示,其中负数以 a 开头1。完整的数字是-1,数字小一(二进制)是-2等等。

上面的位模式是 的 2 的补码表示-2

要打印位模式和类型,请使用以下代码:

fmt.Println(^1)

fmt.Printf("%T\n", ^1)

fmt.Printf("%064b\n", 1)

i := ^1

fmt.Printf("%064b\n", uint(i))

它输出(在Go Playground上试试):


-2

int

0000000000000000000000000000000000000000000000000000000000000001

1111111111111111111111111111111111111111111111111111111111111110


查看完整回答
反对 回复 2022-11-28
?
一只斗牛犬

TA贡献1784条经验 获得超2个赞

好的,这与我们在计算中使用符号的方式有关。


对于一个 1 字节的数字,你可以得到


丁 乙

-8  1000

-7  1001

-6  1010

-5  1011

-4  1100

-3  1101

-2  1110

-1  1111

0 0000

1 0001

2 0010

3 0011

4 0100

5 0101

6 0110

7 0111

你可以在这里看到 1 等于 0001(没有变化)但 -1 等于 1111。^运算符执行按位异或运算。所以:


0001

1111 xor

-------

1110 -> That is actually -2. 

所有这一切都是因为我们用来计算负数的两个补码的约定。当然,这可以外推到更长的二进制数。


您可以使用 Windows 计算器进行异或按位计算来对此进行测试。


查看完整回答
反对 回复 2022-11-28
  • 2 回答
  • 0 关注
  • 129 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信