c++ - 为什么 "-3 >> 1"不会产生与 "-3/2"相同的结果?

标签 c++ operators difference integer-division

<分区>

考虑以下 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”。但是这样做引入了一个错误:几个图形项目不再像预期的那样居中。由此我注意到,如果除法的值为负,用除法代替移位会产生不同的结果,这就是上述问题的原因。

我希望这能解决问题。

最佳答案

-3 在二进制补码系统中

11111111111111111111111111111101       :BIN

当右移时

11111111111111111111111111111110       :BIN

这是十进制的 -2 的意思。

但是,当您将两个数字相除时,例如 -3/2,答案是 -1.5,当将其转换为整数时,结果为 -1。

关于c++ - 为什么 "-3 >> 1"不会产生与 "-3/2"相同的结果?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48835071/

相关文章:

sql - "<>"的 SQL 运算符名称是什么?

android - AsyncTask 和 Thread 之间的真正区别

c - C 中变量和函数的区别?

python - Python中使用哈希获取两个对象列表之间的差异

c++ - 不要使用Bazel破坏共享库的名称

c++ - 关于类(class)返回另一个类(class)的 SWIG-Lua 问题

c++ - 如何找到exe的路径

c++ - 具有不同类型的两个参数的隐式模板类型推导

ruby - 比较整数时未定义的方法 <= 为 false

c++ - 如何解释一会儿里面的情况?而(+(+ k--)!= 0)