议“右移一位 等同于 除以二”

5500阅读 0评论2012-11-26 bruceteen
分类:C/C++

对于正整数(包括无符号类型,和值为正的有符号类型),毫无疑问。对于负整数,随便举个例子
-5/2 = -2;  -5>>1 = -3;
看起来不等

现在单说“除”
在 C99 和 C++0x 之前,只保证 商*除数+余数==被除数,如果希望商向零靠近取整,应当使用div函数。
即 (-13)/4 的结果可能是 -3余-1,也可能是 -4余3。
C99和C++0x规定,商向零靠近取整,即:
(-13)/4 结果是 -3余-1
13/(-4) 结果是 -3余+1
(-13)/(-4)结果是 +3余-1

回正题,看来
-5/2 是 商为 -2 余 -1,即商向零靠近取整
-5>>1 是 商为 -3 余 +1,即以取小原则取整

同样,-11%16等于-11(即商1余-11),而-11&15等于5(即商-1余5)都是正确的

上一篇:【转载】《为什么java如此招人厌恶-Quora版》
下一篇:获取图像的EXIF信息