gpt4 book ai didi

c++ - 片段中的差异

转载 作者:塔克拉玛干 更新时间:2023-11-03 01:57:20 25 4
gpt4 key购买 nike

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

第一个片段

    #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/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com