C++左移操作

标签 c++ bit-shift

这是我的代码

int a=2147483647; 
int b= a<<1;
cout<<"a="<<a<<",  b="<<b;

我得到的输出是- a=214783647, b=-2

a的二进制表示是

0111 1111 1111 1111 1111 1111 1111 1111

通过将其移动 1 位,它将改变符号位并将 LSB 替换为 0。因此,我认为答案将是 -ve,幅度将减去 1,即 -2147483646 但它给出的结果为 -2 。请解释。

最佳答案

这是因为您的计算机对有符号值使用 2 补码。 无符号移位值是 0xFFFFFFFE,即 2 补码中的 -2,而不是 -2147483647

Shifting 是用 C 定义的实现。

顺便说一句,-2147483647 在这样的 CPU 上是 0x80000001

关于C++左移操作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55456995/

相关文章:

c++ - __int64 格式化输出为十六进制

C++ 简单函数困境

c++ - 指向指针数组的指针(动态分配)

Java 位掩码范围

c# - 为什么我在 Powershell 和 C# 之间得到不同的结果

c++ - 由于 ADL,对模板函数的调用不明确

c++ - VC++ 2013 调试器卡住

c++ - 反转按位左移和或赋值

c - 如何在C中实现算术右移

c++ - constexpr-evaluating negative bitshift 时的未定义行为?