按位移位舍入

时间:2018-03-13 22:43:06

标签: bit-manipulation bitwise-operators bit-shift

这是关于维基百科https://en.wikipedia.org/wiki/Arithmetic_shift的文章的摘录:

  

在二进制补码有符号二进制数上右移n位   具有将其除以2 ^ n的效果,但它总是向下舍入   (朝负无穷大)。这与舍入方式不同   通常在有符号整数除法中完成(向0舍入)。

有人可以解释向负无穷大四舍五入并向零舍入(以及它们如何不同)的含义并举例说明吗?

我在C:-10>>中注意到了什么。 4 = -1,因为-10 = -1 * 16 + 6但-10 / 16 = 0,因为-10 = 0 * 16-10(这与%的工作方式相同,它给出C中负数的负余数)。我不知道这是否与文本有关,但是想要提供我知道和不知道的信息。

1 个答案:

答案 0 :(得分:0)

在学校,我了解到从1到1.499 [...]的所有数字都会四舍五入,因此从1.5到1.999 [...]的所有数字都会四舍五入。

Rounding朝0的方向必须理解为将结果四舍五入到最接近零的整数。因此,从1到1.999 [...]的所有数字将四舍五入,从-1.999 [...]到 -1 的所有数字将四舍五入为 -1

使用四舍五入到负无穷大,您会将结果四舍五入到最接近负无穷大的整数。因此,从1到1.999 [...]的所有数字将像以前一样四舍五入到,但是 -2 到-1.000 [...] 1的所有数字将四舍五入到 -2

关于右移负值的行为可能取决于语言,但是在C语言中,这很危险,因为实现C standard的6.5.7节中定义的实现

  

E1 >> E2的结果是E1右移E2位的位置。如果E1具有无符号类型   或如果E1具有带符号的类型和非负值,则结果的值为整数   E1 / 2E2的商的一部分。如果E1具有带符号的类型和负值,则   结果值是实现定义的。