我搜索并找到了与此问题相关的主题,但在所有这些主题中,原因是溢出(结果对于int类型来说太大了,对吧?)。 但在这种情况下,结果小于int的最大值,仍然从2个正数产生负数。我想知道为什么。
继承人代码:
int s = (50*49*48*47*46*45);
out.println(s);
OUTPUT:
-1443597888
现在当我尝试449而不是49时:
int s = (50*449*48*47*46*45);
out.println(s);
OUTPUT:
1760488896
那为什么会这样呢? 我一般想计算(50 * 49 * 48 * 47 * 46 * 45)/(1 * 2 * 3 * 4 * 5 * 6),但它一直给出否定的结果。
感谢您的帮助。
哦,是的,我正在使用Java,这是一个非常早期的初学者,所以我几乎没有了解最新情况。感谢。
答案 0 :(得分:2)
您没有指定使用的语言,也没有指定int表示的位数。但似乎这是一个溢出问题。
从你的第二个例子:
50*449*48*47*46*45
是104839704000
,它是二进制的:
01100001101000111011101110110111000000
但你得到的结果是1760488896
,它是二进制的:
00000001101000111011101110110111000000
第一位(开头的0110...
)被切断了。
似乎你有32位的int表示。哪个是小而代表11441304000
- 50*49*48*47*46*45
的结果。
在这两种情况下都会出错。为什么它仅在第一个例子中是否定的?
11441304000
的二进制表示是
010 10101001111101000111000111000000
但只有32(粗体)位适合您的整数变量。第一个是1
,它被转换为负十进制值。
答案 1 :(得分:2)
您选择的编程语言的“int”类型可能使用32位有符号整数表示。这意味着使用固定数量的比特来表示数字,因此可以存储的数字范围是有限的。最常见的是,范围是-2147483648到2147483647(或者说不同,-2 ^ 31到2 ^ 31-1),最好参考您的编程语言文档进行确认。
因此,int只能在该有限范围内,但计算的实际结果(50 * 49 * 48 * 47 * 46 * 45)将为11441304000,这远远超出该范围,因此其中一个乘法会导致溢出。
不同的编程语言和平台以不同的方式处理它,但一个通常的结果是数字只是环绕,所以2147483647 + 1将导致-2147483648。其他编程语言将捕获此并生成错误。其他人将再次自动切换到更大的表示,因此您根本不会出现溢出,但可以使用任意大的数字。
您使用的语言似乎属于第一个无声溢出的组,因此您只会得到错误的结果。
答案 2 :(得分:0)
正如其他人所指出的,问题是计算50*49*48 ...
太大而不适合Java int
。你可以切换到更大的固定精度类型,即long
,但是你会遇到一些其他更大的参数问题。我的建议是使用Java的BigInteger
类型来存储结果。