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

时间:2013-01-22 08:51:04

标签: java encoding snmp

我正在查看SNMPBEECodec,可以在此location看到 特别是我正在查看函数encodeLength()
我感兴趣的片段

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

(来自Drexel SNMP library)。

我想知道为什么使用Math.floor()而不是像temp/256这样的简单整数除法。似乎简单的整数除法会给出相同的结果。或者是否存在技术差异?

2 个答案:

答案 0 :(得分:21)

回答问题的技术部分:

使用math.floor()是多余的:temp / 256是一个整数(按照Java的整数运算规则),并且对整数使用Math.floor()是没有意义的。您只需使用temp / 256

为什么作者这样做是不可能不回答他们的想法回答。作者可能只是对Java中的划分行为感到困惑,并决定“安全地玩” - 但这只是猜测。

答案 1 :(得分:20)

嗯,不幸的是,作者再也无法读懂他的想法了 - 自从我写这篇文章已有12年了,所以我忘记了我不仅仅使用整数除法的原因。一些想法:我在其他地方使用整数除法假设通常的行为,因此它不可能是对Java中整数除法规则的基本混淆;有可能(虽然不太可能)我在某个时候使用非整数数据类型作为参数,并且当我改变时没有摆脱多余的floor();或者(更有可能)我在某些时候试图在开发算法时尝试向上而不是向下,使用ceil()作为一种廉价(=更少的字符)方式来做到这一点,并且只是反射性地切换到floor()当我改变。

所以不幸的是,真正的原因在时间的迷雾中消失了......但我同意,地板()是多余的。我应该在Github上发布代码,以便人们可以改进和发展它。   \   乔恩