c - 为什么`1<<32 - 1`是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
推荐阅读
- r - 如何在 R 中以 1 分钟为基础分布多个时间间隔值?
- java - 当用户在Android中关闭应用程序时如何重新启动应用程序
- reactjs - LocalStorage 未使用 React 钩子更新状态中的属性
- .net-core - 寻找一种方法来更改 http 请求并在正文数据上添加用户 ID
- coq - compare.vo 包含库 Top.comparable 而不是库可比较
- flutter - 如何以颤动的 TimeOfDay 以 AM 或 PM 格式显示时间?
- c++ - 为什么以及何时在 C++ 中的下界函数前面添加指针?
- powershell - 使用 powershell 获取超过 1 小时的打印作业
- unix - 如何将 OCaml 信号转换为 POSIX 信号或字符串?
- c++ - 当我们重复 make all 命令时会发生什么?