按位移位舍入

问题描述 投票:0回答:1

这是关于维基百科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)中负数的负余数。我不知道这是否与文本有关,但是想要提供我知道和不知道的信息。

bit-manipulation bitwise-operators bit-shift
1个回答
0
投票

在学校,我学到了从1到1.499的所有数字[...]将轮到1,因此从1.5到1.999 [...]将轮到2。

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

通过向负无限舍入,您将将结果舍入到下一个最接近负无穷大整数。因此,从1到1.999 [...]的所有数字将像以前一样舍入到1,但是从-2到-1.000 [...] 1的所有数字将舍入到-2。

关于右移负值的行为,它可能取决于语言,但在C中,这是危险的,因为实施的定义如C standard第6.5.7节所述

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

© www.soinside.com 2019 - 2024. All rights reserved.