为什么 ^1 等于 -2?

fmt.Println(^1)

为什么打印这个-2


白衣染霜花
浏览 135回答 2
2回答

30秒到达战场

该^运算符是按位补码运算符。规范:算术运算符:对于整数操作数,一元运算符+、-和^定义如下:+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:1111111111111111111111111111111111111111111111111111111111111110The^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 := ^1fmt.Printf("%064b\n", uint(i))它输出(在Go Playground上试试):-2int00000000000000000000000000000000000000000000000000000000000000011111111111111111111111111111111111111111111111111111111111111110

一只斗牛犬

好的,这与我们在计算中使用符号的方式有关。对于一个 1 字节的数字,你可以得到丁 乙-8  1000-7  1001-6  1010-5  1011-4  1100-3  1101-2  1110-1  11110 00001 00012 00103 00114 01005 01016 01107 0111你可以在这里看到 1 等于 0001(没有变化)但 -1 等于 1111。^运算符执行按位异或运算。所以:00011111 xor-------1110 -> That is actually -2. 所有这一切都是因为我们用来计算负数的两个补码的约定。当然,这可以外推到更长的二进制数。您可以使用 Windows 计算器进行异或按位计算来对此进行测试。
打开App,查看更多内容
随时随地看视频慕课网APP