首页 > 解决方案 > 为什么`1<<32 - 1`是4294967295?

问题描述

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

fmt.Print( 1<<32 - 1)

it's 4294967295

但是在C

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

标签: cgobit-shift

解决方案


在 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


推荐阅读