为什么在BER编解码中使用Math.floor()而不是整数除法

18

我正在查看 SNMPBEECodec,可以在此 位置 查看。
特别地,我正在关注函数 encodeLength()
我感兴趣的代码片段如下:

        int numBytes = 0;
        int temp = length;
        while (temp > 0)
        {
            ++numBytes;
            temp = (int)Math.floor(temp / 256);
        }   

(来自Drexel SNMP库)。

我想知道为什么要使用Math.floor()而不是像temp/256一样进行简单的整数除法。它似乎会得到相同的结果。还是说有技术上的区别?


4
不,一般情况下这样的代码可能有很好的技术原因。了解这个原因可能非常有趣。但是,这不是这种情况。然而,如果你自己不知道,只有通过询问才能找出答案。 - sleske
3
它们并不严格等同:https://dev59.com/fmkv5IYBdhLWcg3wpCQz 然而,由于您示例中的temp>0,因此它是等效的。 - assylias
我问这个问题的原因是因为 Drexel 图书馆在 SNMP 中相当受欢迎。我想知道是否有一些明显的东西我错过了。看起来似乎没有。 - bobby
2
@EJP 我认为问题实际上是:它们是否等效,如果它们是,哪一个更好。 - assylias
3
@EJP:说得好。我编辑了问题,试图让它更清晰,因为我认为这是一个有效的问题。希望能有所帮助。 - sleske
显示剩余4条评论
2个回答

23

回答你问题中的技术部分:

使用math.floor()是多余的:根据Java整数算术规则,temp / 256是一个整数,因此在整数上使用Math.floor()是没有意义的。你可以直接使用 temp / 256

为什么作者这样做无法回答,除非读懂他们的想法。作者可能只是对Java中除法的行为感到困惑,并决定“保险起见” - 但这只是猜测。


22

很不幸,作者也无法再读懂他自己的思路了-距离我写下这个问题已经约有12年之久,所以我忘记为什么我没有使用整数除法。 一些想法:在其他地方我使用整数除法并假设通常行为,因此在Java中并不会对整数除法规则产生基本混淆; 可能(尽管不太可能)我曾经在某个时候使用了非整数数据类型作为参数,并且在更改时没有去掉多余的floor(); 或者也许(更有可能)在开发算法时,我曾经试图向上舍入而不是向下舍入,使用ceil()作为一种廉价(=更少字符)的方法来实现这一点,并且在更改时只是反射性地切换到floor()。

很遗憾,真正的原因已经失落在时间的迷雾中...但是我同意,floor()是多余的。 我应该将代码发布在Github或类似网站上,以便人们可以改进和发展它。 \ Jon


你是不是想实现向下取整除法?这对于负数有所不同:-1 向下取整除以 8-1 而不是 0。如果你写成了 256.0 而不是 256 那么向下取整除法就能正常工作了。 - Aaron Franke

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接