Tag: 溢出

在Java中使用long转换为byte

我无法理解以下内容: 在java中, long l = 130L; byte b = (byte)l; 如果我打印b的值,为什么我得到-126? 长l的位代表是什么?

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,那么我得到一个完全错误的结果。

如何防止Java代码中的整数溢出?

可能重复: 如何检查Java中的两个数字相乘是否会导致溢出? 假设我有一个Java类方法,它使用*和+操作。 int foo(int a,int b){ … //用+和*进行一些计算 } 如何确保foo中没有溢出? 我想我可以使用BigDecimal或用“wrappers”替换所有+和*,如: int sum(int a,int b){ int c = a + b; if(a> 0 && b> 0 && c 0 && b> 0 && c <0) 抛出新的MyOverfowException(a,b) 返回c; } 有没有更好的方法来确保Java方法中没有发生int溢出?

达到HashMap或HashSet最大容量时会发生什么?

几分钟后,我回答了一个问题,询问“ Java中HashMap的最大可能大小 ”。 正如我一直读到的, HashMap是一个可扩展的数据结构。 它的大小仅受JVM内存大小的限制。 因此,我认为它的大小没有硬性限制并相应地回答。 (同样适用于HashSet。) 但有人纠正我说,因为HashMap的size()方法返回一个int ,所以它的大小有限制。 一个完全正确的观点。 我只是尝试在我的本地测试它但失败了,我需要超过8GB的内存来在HashMap中插入超过2,147,483,647个整数,我没有。 我的问题是: 当我们尝试在HashMap / HashSet中插入2,147,483,647 + 1个元素时会发生什么? 是否抛出错误? 如果是,哪个错误? 如果不是HashMap / HashSet会发生什么,它已经存在的元素和新元素? 如果某人有幸拥有16GB内存的机器,那么你可以尝试一下。 🙂

BigInteger会不会溢出?

API文档说 有关溢出的规范中的所有细节都将被忽略,因为BigIntegers的大小可以根据操作的结果进行调整。 这是否意味着假设您有足够的可用内存,BigInteger永远不会溢出? 如果是这样,为什么我们让一些“类型”溢出而一些不会? 随着语言的发展,它是否会偏向程序员隐藏溢出机制的类型?

两个整数(或多头)没有溢出的平均值,截断为0

我想用Java计算任意两个整数x,y的计算方法(x + y)/2 。 如果x + y> Integer.MAX_VALUE或<Integer.MIN_VALUE,则天真的方式会遇到问题。 Guava IntMath 使用这种技术: public static int mean(int x, int y) { // Efficient method for computing the arithmetic mean. // The alternative (x + y) / 2 fails for large values. // The alternative (x + y) >>> 1 fails for negative values. return (x & y) […]

安全整数中间值公式

我正在寻找一个在Java中工作的高效公式,它计算以下表达式: (low + high) / 2 用于二进制搜索。 到目前为止,我一直在使用“低+(高 – 低)/ 2”和“高 – (高 – 低)/ 2”来避免某些情况下的溢出和下溢,但不是两者都有。 现在我正在寻找一种有效的方法,可以用于任何整数(假设整数范围从-MAX_INT – 1到MAX_INT)。 更新 :结合Jander和Peter G.的答案并进行实验一段时间我得到了中值元素及其近邻的以下公式: 最低中点(等于floor((low + high)/2) ,例如[2 3] – > 2,[2 4] – > 3,[-3 -2] – > -3) mid = (low & high) + ((low ^ high) >> 1); 最高中点(等于ceil((low + high)/2) ,例如[2 3] – […]

在JAVA中使用System.nanoTime()时,为什么要使用t1-t0 <0,而不是t1 <t0

当我在JAVA中阅读System.nanoTime()API时。 我找到了这一行: 一个应该使用t1 – t0 <0,而不是t1 <t0,因为数字溢出的可能性。 http://docs.oracle.com/javase/7/docs/api/java/lang/System.html#nanoTime() 比较两个nanoTime值 long t0 = System.nanoTime(); … long t1 = System.nanoTime(); 一个应该使用t1 – t0 <0,而不是t1 <t0,因为数字溢出的可能性。 我想知道为什么t1 – t0 < 0是防止溢出的最佳方法。 因为我从其他一些线索中读到A < B比A – B < 0更优选。 Java Integer compareTo() – 为什么使用比较与减法? 这两件事情是矛盾的。

常见的下溢和溢出exception

我试图在java中获得溢出和下溢exception,但无法获得任何好的教程。 具体来说,我想学习 他们彼此有什么不同? 这些例外的子类是什么? 在哪种情况下他们被抛出? 哪些可以处理以及如何处理? 与他们相关的最佳实践是什么? 任何有用教程的链接都可以

两个整数的乘法溢出导致负数

请考虑Java语言规范中的此片段。 class Test { public static void main(String[] args) { int i = 1000000; System.out.println(i * i); long l = i; System.out.println(l * l); } } 输出是 -727379968 1000000000000 为什么结果-727379968 (i*i) ? 理想情况下应该是1000000000000。 我知道Integer的范围是从-2147483648到2147483647.所以显然1000000000000不在给定的范围内。 为什么结果变成-727379968 ?