c - C中的左移运算符给出奇怪的结果
问题描述
我有以下程序:
int main()
{
int64_t a = 241294423792285589;
printf("a = %lld, a << 63 = %lld", a, a << 63);
return 0;
}
我原以为a << 63
是 0,但它打印出来:
a = 241294423792285589, a << 63 = -9223372036854775808
为什么是这样?
解决方案
如果将这些整数转换为有符号 2 的补码二进制,您会明白原因:
二进制的 241294423792285589 是
0000001101011001010000000000000000000000011010111111011110010101
将此左移 63 个点将导致最右边的1
最终以最左边的二进制数字结尾:
1000000000000000000000000000000000000000000000000000000000000000
在 2 的补码二进制中是 -9223372036854775808。
您可以在线找到二进制 <-> 十进制转换器(例如这个:https ://www.rapidtables.com/convert/number/decimal-to-binary.html ),这有助于使这一点更加清晰。
或者你甚至可以试试这个位移计算器:https ://bit-calculator.com/bit-shift-calculator
推荐阅读
- sqlite - 如何在 SQLite 中获取分层树路径?
- reactjs - reactjs中的警报
- xamarin - MvvmCross 6.0 在关闭当前视图模型之前导航到视图模型
- python - Python函数通过记忆返回不同的结果
- .net - 用于桌面应用程序的受 OpenID Connect 保护的 API
- r - 无法使用 R Shiny 中的 DT 包取消选择代理选择的行
- c# - 我的 C# 程序正在使用过多的内存(BinaryReader 来缓冲)
- php - PHP 从 html 文件中提取特定标签之间的数据
- ios - iOS Swift - 从设置打印到标签
- node.js - AWS Elastic beanstalk 上的 Google 日历身份验证