<分区>
考虑以下 C++ 代码:
int main()
{
int a = -3 >> 1;
int b = -3 / 2;
cout << "a = " << a << ", b = " << b << endl;
return 0;
}
执行时,此代码给出以下结果:
a = -2, b = -1
我有点疑惑,因为我认为这两个操作在编译后的 exe 中产生了相同的代码,即类似于:
shr ax, 1
但似乎并非如此(我用 2 个不同的编译器进行了测试)。有人可以向我解释为什么这些操作不会产生相同的结果吗?
---- 2018 年 2 月 17 日编辑 ----
好吧,我知道这是一个新手问题,即使我不是真正的 C++ 初学者
事实上,当我对一个值应用右移(即 shr 或 >> 运算符)时,我完全理解二进制会发生什么。 这不是我的问题。
相反,我的问题是关于对值应用二进制移位或对值进行除法之间的区别。 我预计结果是一样的,因为直到现在我都假设编译器在编译期间通过适当的 shr/shl 指令替换了除以 2 或乘以 2,作为优化.假设两条指令生成的二进制文件应该相同,因此结果也应该相同。
但显然不是这样。出于这个原因,我很乐意知道当编译器编译这两条指令(分析助记符并不是我的强项)时在幕后发生了什么,它们有什么区别,最后,这个应该让我明白为什么结果在数学上有所不同。
作为一个具体案例,我在我试图简化的图形应用程序的源代码中遇到了这个问题。为了方便人类阅读代码,我用“(widthB - widthA)/2”替换了一些代码,如“(widthB - widthA) >> 1”。但是这样做引入了一个错误:几个图形项目不再像预期的那样居中。由此我注意到,如果除法的值为负,用除法代替移位会产生不同的结果,这就是上述问题的原因。
我希望这能解决问题。