c++ - 片段中的差异

标签 c++

虽然下面的两个片段在查找变量的操作上略有不同,但输出似乎仍然相同。为什么会这样?

第一个片段

    #include<iostream>
    using namespace std;
    int main()
    {

    int number = 3,find;
    find = number << 31;
    find *= -1;
    cout << find;
    return 0;
    } 

第二个片段

   #include<iostream>
   using namespace std;
   int main()
   {
   int number = 3,find;
   find = number << 31;
   find *= 1;
   cout << find;
   return 0;
   } 

两个片段的输出:

-2147483648

(根据 Ideone:12)

最佳答案

在你的两个样本中,假设 32 位 int s,您正在调用 Why does left shift operation invoke Undefined Behaviour when the left side operand has negative value? 中指出的未定义行为

为什么?因为number是签名int ,具有 32 位存储空间。 (3<<31)在该类型中不可表示。

一旦您处于未定义的行为区域,编译器就可以为所欲为。

(您不能依赖以下任何内容,因为它是 UB - 这只是对您的编译器似乎在做什么的观察)。

在这种情况下,编译器似乎在进行右移,结果是 0x80000000作为二进制表示。这恰好是 INT_MIN 的补码表示。 .所以第二个片段并不奇怪。

为什么第一个输出相同的东西?在二进制补码中,MIN_INT 将为 -2^31 .但是最大值是2^31-1 . MIN_INT * -1将是 2^31 (如果它是可代表的)。猜猜那会有什么代表? 0x80000000 .回到你开始的地方!

关于c++ - 片段中的差异,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/5776826/

相关文章:

c++ - 将数字转换为文本,C++

C++:带有内存映射文件的 DLL

c++ - VS Code C++ 扩展给出错误 "namespace has no member function"

c++ - 如何在一次只允许 1 个选定项目的 ListView 中选择一个项目

c++ - 递归打印星形图案

c++ - 获取特定进程的线程句柄/id

c++ - 在 Xcode 上打开用 emacs 编写的代码出现严重缩进

C++我如何为switch case做异常处理

c++ - 指向可变模板静态函数的指针。如何?

c++ - 使用 GetDIBits 加载位图