在学习 CSAPP 第二章中关于整数除法的部分的时候遇到了一些问题。主要是在讨论算术右移和除以 2 的幂次的结果之间的关系。
根据书中的说法,对补码表示的数字,直接算术右移的结果是向下舍入的。在正数部分没有问题,但是在负数结果下会导致与除法不一致的结果。
比如 -12340 / 2^4 的结果是 -771.25,除法计算会舍入到 -771,但直接右移 4 位会得到 -772。
估计是为了在保证除法总是向零舍入的前提下能使用位移对除法计算进行优化(存疑,这个是我个人的猜测),书上给出了一个解决方案,即为了正确地得到除以 \(x / 2^k\) 的结果,引入一个 bias,底层实际进行的操作是 (x + (1 << k) - 1) >> k
,这个操作能够得到向零舍入的数值。
我的疑问是,为什么要这样做?这个 bias 的出现是很精巧的,是为了保证『舍入到零』这个前提而出现的。但是为什么要这样规定?如果规定总是向下舍入的话,那就可以直接使用右移来优化对于 2 的幂次的除法了,不需要这么多的补丁。直觉上来说向下舍入的规定也比引入的这个 bias 要自然的多。此处感觉上不太通顺,希望有大佬能够予以解答,非常感谢~
简单理解一下
做整数除法的时候,除了
商
还有一个你会关心的是余数
直接向下取整,
余数
通过小学数学,非常容易获得,也很容易理解如果是向上取整,这个
余数
的计算和你学过的数学方法就差的有点远了,理解起来不太常规四舍五入的话,
余数
就没法整了