使用二进制补码理解写入bluej的程序。

时间:2014-01-30 18:27:46

标签: java windows integer bluej

我刚开始使用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,我不知道为什么。 提前感谢大家的回复!

3 个答案:

答案 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)受大小限制时,您的操作必须在其范围内有意义。