当前位置: 首页 > 科技观察

来吧,想一想:什么时候x-2不等于x--1?

时间:2023-03-18 20:23:24 科技观察

地球人都知道,在计算机的世界里,乘法和除法可以用移位来实现,例如下面两个方程:x*2≡x<<1x/2≡x>>1但实际上,有时候事情不是你想的那样。在C语言标准中,没有要求有符号整数的内部表示是2的补码。在计算机中,正数有统一的表示形式,但如果数字为负数,则可以有不同的表示形式。如果x是负数,那么x*2和x<<1在符号/量级系统中是完全不同的。然而,Win32需要在基于二进制补码的硬件系统上执行,在这种情况下,第一个等效项x*2≡x<<1确实总是正确的。当然,编译器可以自由地识别这一点并重写您的乘法或移位操作。事实上,它可能确实如此,因为x+x比乘法或移位更容易配对。移位运算或乘以2可能会被重写为更接近addeax,eax指令的内容。至于第二个所谓的等价,C语言规范最初并没有规定负数除以正数是四舍五入还是四舍五入为零,但在1999年规范被修改为要求四舍五入为零。此外,负向右移的结果未指定,因此如果x为负,则表达式x>>1的结果未指定。即使你假设移位用符号位填充,如果x为负,移位和除法的结果是不同的。(-1)/2≡0(-1)>>1≡-1故事的寓意如果你想做某事,请明确告诉编译器我想做什么。如果要除以2,请写“/2”而不是“>>1”。综上所述,我还没有弄清楚转变的细节。总需要的时候,我就拿出一张纸,用笔画出班次的示意图。我的脑子还是不如你的CPU。我又得把那本《深入理解计算机系统》再读一遍。