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

jog*_*ito 17 java encoding snmp

我正在查看可以在这个位置看到的SNMPBEECodec
特别是我正在查看encodeLength()
我感兴趣的函数A片段

        int numBytes = 0;
        int temp = length;
        while (temp > 0)
        {
            ++numBytes;
            temp = (int)Math.floor(temp / 256);
        }   
Run Code Online (Sandbox Code Playgroud)

(来自Drexel SNMP库).

我想知道为什么Math.floor()使用而不是像一个简单的整数除法temp/256.似乎简单的整数除法会给出相同的结果.还是有技术差异?

sle*_*ske 21

要回答您问题的技术部分:

使用math.floor()是多余的:temp / 256是一个整数(按照Java的整数运算规则),并且Math.floor()对整数使用是没有意义的.你可以简单地使用temp / 256.

如果没有阅读他们的想法,作者为什么这样做是不可能回答的.作者可能只是对Java中的划分行为感到困惑,并决定"安全地玩" - 但这只是猜测.


小智 21

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

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