Tag: 整数溢出

重现行为MAX_VALUE和MIN_VALUE

以下内容也适用于其他MIN_VALUE和MAX_VALUE ,但现在只关注Integer 。 我知道在Java中,整数是32位, Integer.MAX_VALUE = 2147483647 (2 31 -1), Integer.MIN_VALUE = -2147483648 (-2 31 )。 当你超出它们的界限时使用这些值计算时,数字会回绕/溢出。 因此,当您执行类似Integer.MAX_VALUE + 1 ,结果与Integer.MIN_VALUE相同。 以下是MIN_VALUE和MAX_VALUE一些基本算术计算: Integer.MAX_VALUE: 2147483647 Integer.MAX_VALUE + 1: -2147483648 Integer.MAX_VALUE – 1: 2147483646 Integer.MAX_VALUE * 2: -2 Integer.MAX_VALUE * 3: 2147483645 Integer.MAX_VALUE * 4: -4 Integer.MAX_VALUE * 5: 2147483643 Integer.MAX_VALUE / Integer.MAX_VALUE: 1 Integer.MAX_VALUE * Integer.MAX_VALUE: […]

Java乘法运算行为

我写了一个方法来将给定数字从天转换为毫秒: private long expireTimeInMilliseconds; … public void setExpireTimeInDays(int expireTimeInDays) { expireTimeInMilliseconds = expireTimeInDays * 24 * 60 * 60 * 1000; } 我很难弄明白我做错了什么。 现在我的问题是 : 这个错误是如此明显吗? 纠正方法: private long expireTimeInMilliseconds; … public void setExpireTimeInDays(int expireTimeInDays) { expireTimeInMilliseconds = ((long) expireTimeInDays) * 24 * 60 * 60 * 1000; } 如果我在计算之前没有将整数转换为long,那么我得到一个完全错误的结果。

非空字符串的哈希码是否可以为零?

通过“非空”,我的意思是在这个问题中包含至少一个非零字符的字符串。 作为参考,这是hashCode实现: 1493 public int hashCode() { 1494 int h = hash; 1495 if (h == 0) { 1496 int off = offset; 1497 char val[] = value; 1498 int len = count; 1499 1500 for (int i = 0; i < len; i++) { 1501 h = 31*h + val[off++]; 1502 } 1503 hash […]

解释两个数字的安全平均值

每当我需要为二进制搜索等算法平均两个数字时,我总是这样做: int mid = low + ((high – low) / 2); 我最近在这篇文章中看到了另一种方法,但我不明白。 它说你可以用Java做到这一点: int mid = (low + high) >>> 1; 或者在C ++中: int mid = ((unsigned int)low + (unsigned int)high)) >> 1; C ++版本实质上使两个操作数都无符号,因此执行移位会导致算术移位而不是有符号移位。 我理解这两段代码正在做什么,但这如何解决溢出问题? 我认为整个问题是中间值high + low可能溢出? 编辑: 哦,呃。 所有答案都没有完全回答我的问题,但是@John Zeringue的答案让它点击了。 我会试着在这里解释一下。 Java中的(high + low)/2问题并不完全是high + low溢出(它会溢出,因为整数都是有符号的,但所有的位仍然存在,并且没有信息丢失)。 像这样取平均值的问题是分裂。 该部门以签名值运作,因此您的结果将为负数。 相反,使用移位将除以2但考虑位而不是符号(有效地将其视为无符号)。

如何修复整数溢出产生的错误数字?

我有一个导致整数溢出的错误,导致写入数据库的错误(负)时间戳。 代码已经修复,但我也想修复错误的数据 。 我想,我可以采取错误的结果并添加Integer.MAX_VALUE,但这似乎不起作用,它让我高价值。 我在下面的代码片段中有offset值,但不存储输入值。 以下代码重现了该错误: @Test public void testArexxConversion() { // The input values represent seconds since midnight, Jan 1, 2000 UTC final int sample = 361450072; // A sample input value drawn from production // I use the offset from the UNIX epoch to convert the vakue to UNIX seconds final int offset […]

为什么这个乘法整数溢出会导致零?

在回答了这个问题后 ,我很困惑为什么这段代码中的溢出整数导致0而不是负数。 这很奇怪,为什么这么准确? 为什么0? public class IntegerOverflow { public static void main(String[] args) { int x = 10; int i = 0; for (i = 0; i <= 5; i++) { x = x * x; System.out.println(x); } } } 输出: 100 10000 100000000 1874919424 0 0

为什么整数数据类型以静默方式溢出而不是抛出exception

我已经学会了(至少在java中)整数/长值静默地溢出,它们的值从溢出时的最小值开始而不是抛出任何exception。 我正在使用外部api进行某些文件操作,其中从属性文件加载最大文件大小。 在我当地的测试环境中一切都很好。 代码进入实时环境后,最大文件大小限制根本不起作用。 经过两天的调试/分析代码后,根本没有成功。 然后由于其他原因,我采用了live constants.properties文件并用它调试了代码。 O_0 我只是想问,是什么阻止他们在溢出时抛出exception?