2013-06-29 49 views
0

我不明白int 63823如何比double 1.0占用更少的空间。在这个特定的实例中,是否没有更多的信息存储在int中?为什么double总是8个字节,int总是4个字节,即使int有更多的数字?

+1

C'mon,double和float都是浮点数,我的意思是int,简称,字节不接受浮点数,系统以x.xEx格式显示float值,只需设置一个双精度为1000并打印它 – 2013-06-29 18:03:19

+1

变量的大小反映了可以存储在那里的最大信息量,而不是实际存储在任何时间点的量。查看香农和信息理论。 –

+2

忽略仇敌。这是一个很好的问题。 – jason

回答

7

我不明白int 63823是如何占用比double 1.0少的空间。在这个特定的实例中,是否没有更多的信息存储在int中?

好问题。当你看到638231.0表示的底层数据时,你看到的是你看到底层数据的而不是。它是专门格式化的,以便可以读取它,但它是而不是机器如何看到它。

Java使用非常特殊的格式来表示intdouble。您需要查看those representations以了解为什么63823在表示为Java int1.0时需要六十四位,因为它表示为Java double

特别地,如63823在Java中intrepresented为:

00000000000000001111100101001111 

和1。0为doublerepresented在Java作为:

0011111111110000000000000000000000000000000000000000000000000000 

如果你想探索更多,我建议Two's ComplementWhat Every Computer Scientist Should Know About Floating-Point Arithmetic

1

这些原始数据类型需要定义在某处供您使用。它不是一个灵活的容器,你可以随心所欲地装入东西,而更像是一个瓶子,无论是空的还是空的,都可以使用相同的空间。而且他们也有最大的限制。 更多了解自己here.

0

未显示的零也计数。大约,忽略这些数字实际上是存储在二进制,而不是十进制,当你写与隐含的零位包括这两个数字,你会得到这样的事实:

1.0 = 1.00000000000000000*10^0000 
63823 = 0000063823 

正如你所看到的,1.0是两倍长为63823.因此它需要两倍的存储空间。

+0

匿名downvoter可能已经得到了一些反对我的教学方法,嗯? – Joni

3

不完全。 double 1.0表示更多的信息,因为通过将双精度定义为64位浮点数,可以得到更多的值,它可以是可能是。要使用你的例子,如果你有一个特殊的数据类型只能有两个值,63823和98321234213474932,那么只需要1位来表示数字63823,尽管它比int小得多。

在实现方面,使用固定大小的数据类型通常更容易和更快速,因此您可以分配固定的内存块(这是一个变量),而不必知道它的价值和不断变化重新分配空间。具有不同方法的变量的例子是String和BigInteger,它们分配空间来容纳它们的值。请注意,两者在Java中都是不可变的 - 这不是巧合。

+0

+1讨论为什么我们想要固定大小的数据类型。 – selig

0

int和double根本没有小数位。除去前导零点后,int的十进制表示形式有8位十进制数字。整数本身有32 二进制数字的空间。这个double在尾数中有53个二进制数字的位数和一个10位指数和一个符号位。

相关问题