Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/337.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 为什么在BER编解码器中使用Math.floor()代替整数除法_Java_Encoding_Snmp - Fatal编程技术网

Java 为什么在BER编解码器中使用Math.floor()代替整数除法

Java 为什么在BER编解码器中使用Math.floor()代替整数除法,java,encoding,snmp,Java,Encoding,Snmp,我正在看SNMPBEECodec,可以在这里看到 我特别关注的是函数encodeLength() 我感兴趣的一个片段 int numBytes = 0; int temp = length; while (temp > 0) { ++numBytes; temp = (int)Math.floor(temp / 256); } (摘自) 我想知道为什么使用

我正在看SNMPBEECodec,可以在这里看到
我特别关注的是函数
encodeLength()

我感兴趣的一个片段

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


我想知道为什么使用
Math.floor()
而不是像
temp/256这样的简单整数除法。看来简单的整数除法也会得到同样的结果。还是有技术上的差异?

要回答问题的技术部分:

使用
math.floor()
是多余的:
temp/256
是一个整数(根据Java的整数算术规则),对整数使用
math.floor()
是毫无意义的。您可以简单地使用
temp/256


不了解他们的想法,就无法回答作者为什么这样做。作者可能只是对Java中除法的行为感到困惑,并决定“谨慎行事”——但这只是猜测。

好吧,不幸的是,作者也无法读懂自己的心思了——我写这篇文章已经有12年了,所以我忘了我不使用整数除法的原因。一些想法:我在其他地方使用整数除法,假设是通常的行为,因此不太可能对Java中的整数除法规则产生基本的混淆;有可能(尽管不太可能)我在某个时候使用了非整数数据类型作为参数,并且在我更改时没有去掉多余的floor();或者(更有可能)在开发算法时,我曾试图向上取整,而不是向下取整,使用ceil()作为一种廉价的(=更少的字符)方法来实现这一点,当我改变时,我只是本能地切换到floor()

所以不幸的是,真正的原因消失在时间的迷雾中。。。但我同意,发言是多余的。我真的应该把代码发布在Github或类似的网站上,这样人们就可以改进和改进它。 \
Jon

@EJP:不,一般来说,这样的代码可能有很好的技术原因。理解这个原因可能非常有趣。然而,情况并非如此。但是,您只能通过询问您是否不了解自己来发现。它们不是严格等效的:但是,因为在您的示例中temp大于0,所以它是等效的。我问这个问题的原因是因为Drexel库对于SNMP非常流行。我想知道我是否有明显的遗漏。似乎是no@EJP我认为真正的问题是:他们是否等同于amd,如果他们是,那么哪一个“更好”。@EJP:好的观点。我编辑了这个问题,试图让它更清楚,因为我认为这是一个有效的问题。希望这会有帮助。你们有可能是在尝试实施“地板分割”吗?负数则不同:
-1
楼层划分
8
-1
而不是
0
。如果您编写的是
256.0
而不是
256
,那么您将拥有一个工作区分区。