这是针对Java的。我理解这些术语以及它们如何超越它所包含的变量存储限制,如果数字为负数则变为正数,反之亦然。
我无法抛出这些异常。
这是方法。
// computes a + band saves result in answer
public void add (int a, int b)
我尝试添加2,147,483,647 + 1
和-2,147,483,648 -1
甚至除以它但它没有给我一个例外。
有谁知道我做错了什么?
答案 0 :(得分:0)
我理解这些术语以及它们如何超越它所包含的变量存储限制,如果数字为负数则变为正数,反之亦然。
是。这就是发生的事情。当您将最大int
值(2 31 - 1)加1时,您将得到最小的int
值(-2 31 )。您会得到byte
,short
,long
甚至char
的类似行为。
如果float
和double
溢出和下溢导致“无限”值。
我无法抛出这些异常。
首先,“那些”例外不存在。
其次,当整数或浮点运算溢出或下溢时,不会抛出异常。
算术给出异常的唯一情况是整数除零和余数为零......两者都抛出ArithmeticException
。
但是我的实验室问题“当两个正整数的总和为负时,它会导致抛出溢出异常。写相应的异常类溢出”
它要求您声明一个自定义OverflowException
类,并编写您的添加方法,以便在结果溢出时抛出该异常。您必须自己编写溢出检测逻辑。
答案 1 :(得分:0)
这种不寻常的结果是由于数据类型int存储在Java中的方式以及Java如何处理超出存储容量的计算。
回想一下int类型的范围是-2,147,483,648
到+2,147,483,647
,包括在内。您可能会认为加法2,147,483,647
+ 1会导致运行时(整数溢出)错误。事实并非如此,因为Java使用一种名为二进制补码的技术来表示整数;
因此大于2,147,483,647
的数字“环绕”到负值,而小于-2,147,483,648
的数字“环绕”到正值的另一种方式。
即2,147,483,647 + 1 = -2,147,483,648
和-2,147,483,648 - 1 = 2,147,483,647
。
因此,整数加法永远不会引发运行时异常。在某些情况下,如果整数加法确实抛出溢出和下溢异常,则可能更为可取。否则,逻辑错误可能无法检测到。