为什么,给定:
int a = ..., b = ... ;
这是否不安全:
a - b
但这是安全的:
a > b
我所说的安全是指保证不受溢出的影响(我正在编写一个整数的比较器
)。
那要看情况了。。。请参阅系统。nanoTime(),建议使用t1-t0
比较<代码>a
但是,先前的溢出可能会影响此类比较a的正确性
如果在比较器中使用a-b,首先看起来它满足比较器的约定:如果值小于、等于或大于另一个值,则返回小于零、等于零或大于零的数字。但只有在不发生溢出的情况下才是这样。
如果a=1000且b=整数。最小值100(一个非常大的负数,为2147483548),则a-b将溢出。真正的数学结果是500-整数。最小值,大于整数的值。最大值(2147484548)。因此,正返回值表示
但溢出时,值最终小于零(
-2147482748),错误地指示
我在Surface Pro 2平板电脑上运行Windows8.1x64和Java7更新45x64(没有安装32位Java)。 下面的代码在i类型为long时占用1688ms,在i类型为int时占用109ms。为什么在64位JVM的64位平台上,long(64位类型)比int慢一个数量级? 我唯一的猜测是,CPU加一个64位整数比加一个32位整数需要更长的时间,但这似乎不太可能。我怀疑Haswell
问题内容: 在JBox2d中,存在以下代码: 我想知道这里的float <-> int位转换函数的作用是什么。这是否提供解决Java的float比较不准确性问题的方法(如果可能的话)?还是完全不同?我想知道它是否可以替代epsilon方法: PS。为了完整和有趣,这里是: 仅供参考,我可以完美地理解为什么在hashCode()中使用转换函数-哈希ID必须是整数。 问题答案: 解释中可以找到约书亚B
问题内容: 比较浮点数和这样的整数是否安全? 根据JLS(5.6.2。二进制数值提升),如果其中一个参数为,则另一个参数将转换为比较之前的值。但是据我了解,如果转换后的float与原始float二进制相同,则这样的比较将返回true。我们如何确保呢? 问题答案: 是的,您的具体示例很好,因为和都可以精确地表示为。 请注意,通常情况下并非如此:有很多大值无法完全表示为。例如,即使2_000_000_
问题内容: 如果我使用像这样的比较(a是int,b和c是float / double)是否安全: 它可能听起来很荒谬,但是在我的旧编程语言中,有时1 + 2 == 3是错误的(因为左侧返回2.99999999999 …)。而且,这呢: 问题答案: 通常,由于不能精确地将许多十进制数字表示为or 值,因此这样做并不安全。经常陈述的解决方案是测试数字之间的差异是否小于某个“小”值(在数学文献中通常用希
问题内容: Github的安全webhooks页面说: 不建议使用普通运算符。类似的方法执行“恒定时间”字符串比较,从而使其免受常规正则运算符的某些定时攻击。 我在比较密码时使用。 是什么使它成为“安全比较”,我可以使用Node中的标准库来做到这一点吗? 问题答案: “恒定时间”字符串比较的意义在于,无论比较目标是什么(未知值),该比较将花费完全相同的时间量。此“恒定时间”不会向攻击者显示有关未知
我有这段Java代码: 是否保证在控制台上打印?我的意思是,是通过值(这是我需要做的)还是通过引用标识来比较两个装箱的整数? 另外,如果我将它们转换为未装箱的整数,会有什么不同吗