我刚开始使用Bluej来了解有关计算机如何存储整数的更多信息。我有一个小程序,我把它放入Bluej,将一个名为x的整数的值设置为MAX_VALUE - 3然后将1加1到x六次,每次打印出一个新值。 一个补充是不正确的,虽然我需要帮助了解我收到的错误值以及为什么我得到的结果是“奇怪的”。
请记住,我对计算机的语言非常幼稚,而且从字面上读一本关于存储整数的书。我的书是J. Glenn Brookshear的计算机科学第11版。 这是我在BlueJ中编写的程序:
public class Add
{
public Add()
{
int i, x;
x = java.lang.Integer.MAX_VALUE - 3;
i = 0;
while (i < 6) {
x = x + 1;
i = i + 1;
System.out.print(x + "\n");
}
}
}
我收到的价值是:
2147483645
2147483646
2147483647
-2147483648
-2147483647
-2147483646
我的老师说任何整数数学都有问题,但我不知道他的意思。我真的很想知道为什么会这样。 我可能还会注意到这些数字远大于1,我不知道为什么。 提前感谢大家的回复!
答案 0 :(得分:1)
使用int
数据类型存储的整数仅在计算机内存中分配有限的空间。在这个空间量中存储每个可能的整数是不可能的。因此,您的计算机将正确处理-2147483648和2147483647之间的整数,因为这些对于大多数用途来说已经足够了。如果要存储超出此范围的数字,则需要使用int
中的其他数据类型。例如,long
(范围更大)和BigInteger
(实际上仅限于分配给Java本身的空间量)。
当您向尽可能大的int
添加1时,“正确”答案不适合int
变量。这有点像算盘只有一行珠子(可以代表从0到9的数字),并尝试计算9 + 1.您的计算机会将数字滚动到尽可能小的int
代替。因此,当您使用int
值时,效果是2147483647 + 1 = -2147483648,即使数学上这没有意义。
答案 1 :(得分:0)
在这种情况下,Java中的整数有一个限制值max_value ....例如,当你试图超过该值时,它就变成了对位(-2,147,483,648 min_value)。就像完成圆圈并回到开始。因此,没有比2,147,483,647更高的价值......所以当你为这个值加1时,你会得到min_value ...想象它就像一条蛇吃着自己的尾巴;)
答案 2 :(得分:0)
如果您的Windows计算器有程序员视图,请切换到它,单击Dword,输入2147483645,添加1六次,然后观察位。
Java中的整数是32位且签名。这意味着该值有一个符号位和31位。
Integer.MAX_VALUE = 2147483647 (base 10) = 0111 1111 1111 1111 1111 1111 1111 1111 (base 2) Adding 1 yields 2147483647 + 1 = 2147483648 = 1000 0000 0000 0000 0000 0000 0000 0000
如果您不是计算机(或者您的号码不受表示空间限制),这就是您所期望的。但是对于int
数据类型,我们只获得32位而且“第一”(技术上不正确,但有助于理解)告诉您该值是否为负。
现在,当Java将此值转换为基数10时,因为这是带符号整数数据类型......
2147483647 + 1 = 2147483648 = 1000 0000 0000 0000 0000 0000 0000 0000 We read the first bit as 1 so this is a negative number and we need to take its twos-complement to calculate the value. = 1000 0000 0000 0000 0000 0000 0000 0000 negated = 0111 1111 1111 1111 1111 1111 1111 1111 + 1 = 1000 0000 0000 0000 0000 0000 0000 0000 = 2147483648 (base 10) so when we display this value, it's the negative value of the two's complement, = -2147483648
您的老师提到的“整数数学”的问题是,当您的数据类型(在本例中为Java的int)受大小限制时,您的操作必须在其范围内有意义。