【问题标题】:Why is int i = 1<<31 == -2147483648 instead of 2147483648? [duplicate]为什么 int i = 1<<31 == -2147483648 而不是 2147483648? [复制]
【发布时间】:2017-06-16 10:16:34
【问题描述】:

我试图理解按位运算,根据我的说法,整数包含 32 位,并且从 LSB 第 0 位到 MSB 第 31 位,所以如果我将左移 1 设置为 31 位,我想我应该得到 2^31 和二进制表示其中将是 10000000 00000000 00000000 00000000 那么为什么我得到的结果是负面的?如果我错了,请纠正我。

#include<bits/stdc++.h>
using namespace std;
int main(){
    int i=1<<31;
    cout<<i;
    return 0;
}

【问题讨论】:

  • 因为在 2147483648 个组合中,其中一个为 0 :)
  • cout &lt;&lt; std::numeric_limits&lt;int&gt;::max()
  • 如果你有一个(二进制补码)N 位宽的有符号整数,它可以表示从-2^(N-1)2^(N-1)-1 的值。对于您的 32 位整数,最大值为 2^31-1,即 2147483647

标签: c++ c++14 bit-shift signed-integer


【解决方案1】:

整数是一种 32 位的数据类型,它的最高有效位代表符号。 (也就是第 32 位)

因此你得到一个负值

【讨论】:

  • 你忘了说“在某些平台上”
  • 一个int只有31个数据位。将数据移到第 32 位会调用未定义的行为。不知道 OP 会得到什么结果。
  • 具体来说,这在使用二进制补码表示的平台上是正确的,这是大多数平台。 (嗯,除了关于 int 是 32 位的部分。这变化更大;int 允许具有任何长度 >= 16 位。)
  • 是的。在某些平台上
【解决方案2】:

C++ 没有指定包含 1

在不同的平台上,您可能会得到不同的答案、编译错误、格式化驱动器的程序或任何其他行为。

【讨论】:

    猜你喜欢
    • 2012-09-19
    • 2021-02-26
    • 2020-08-20
    • 1970-01-01
    • 2020-08-20
    • 1970-01-01
    • 2011-04-11
    • 2016-04-15
    • 2017-07-16
    相关资源
    最近更新 更多