为什么`1<<32-1`在go中是4294967295?

我在 Go 中发现了一个奇怪的结果,你能帮我吗?

fmt.Print( 1<<32 - 1)

it's 4294967295

但是在 C

 printf("%lld",0x1ll<<32 - 1);
it's 2147483648

回答

在 go 中,1<<32-1解析为(1 << 32) - 1(gofmt 有用地暗示了它插入的空格)。在 C 中,它解析为1 << (32 - 1). 这是因为在 C 中,移位的优先级低于 + 和 -,而在 Go 中,则相反。

您可以在输出中看到这一点,在 go 中它是奇数,并且4294967295是 2^32 - 1。在 C 中它2147483648是 2^31。

Go 运算符优先级(来自https://golang.org/ref/spec#Operators)

Precedence    Operator
    5             *  /  %  <<  >>  &  &^
    4             +  -  |  ^
    3             ==  !=  <  <=  >  >=
    2             &&
    1             ||

在 C 中:https : //en.cppreference.com/w/c/language/operator_precedence


以上是为什么`1&lt;&lt;32-1`在go中是4294967295?的全部内容。
THE END
分享
二维码
< <上一篇
下一篇>>