这是关于维基百科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中负数的负余数)。我不知道这是否与文本有关,但是想要提供我知道和不知道的信息。
答案 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具有带符号的类型和负值,则 结果值是实现定义的。